#sql #oracle
#sql #Oracle
Вопрос:
Допустим, у меня есть эта таблица:
|Fld | Number|
1 5
2 2
И я хочу сделать выбор, который извлекает столько Fld
, сколько Number
имеет поле:
|Fld |
1
1
1
1
1
2
2
Как я могу этого добиться? Я думал о создании временной таблицы и данных instert на основе Number
, но мне было интересно, можно ли это сделать с помощью одного оператора Select .
PS: я новичок в SQL
Комментарии:
1. Я не думаю, что вы можете сделать это с помощью одного оператора Select с произвольным числом, но вы можете сделать это с ограниченным диапазоном чисел или с помощью хранимой процедуры.
2. Я использую pl / sql developer 8.0.0.1480
3. @Roger: С Oracle, я думаю, вы можете сделать это с помощью CONNECT BY .
Ответ №1:
Вы можете объединяться с таблицей чисел:
SELECT Fld
FROM yourtable
JOIN Numbers
ON yourtable.Number <= Numbers.Number
Таблица чисел — это просто таблица со списком чисел:
Number
1
2
3
etc...
Комментарии:
1. 1, может быть, самое время для CTE вместо создания таблицы для него.
Ответ №2:
Не самое лучшее решение (поскольку вы все равно запрашиваете свою таблицу дважды, но, возможно, вы можете работать с ней)
SELECT t1.fld, t1.number
FROM table t1, (
SELECT ROWNUM number FROM dual
CONNECT BY LEVEL <= (SELECT MAX(number) FROM t1)) t2
WHERE t2.number<=t1.number
Он генерирует максимальное количество необходимых строк, а затем фильтрует его по каждой строке.
Ответ №3:
Я не знаю, поддерживает ли ваша версия RDBMS это (хотя я скорее подозреваю, что это так), но вот рекурсивная версия:
WITH remaining (fld, times) as (SELECT fld, 1
FROM <table>
UNION ALL
SELECT a.fld, a.times 1
FROM remaining as a
JOIN <table> as b
ON b.fld = a.fld
AND b.number > a.times)
SELECT fld
FROM remaining
ORDER BY fld
Учитывая вашу исходную таблицу данных, он выводит это (количество включено для проверки):
fld times
=============
1 1
1 2
1 3
1 4
1 5
2 1
2 2
Комментарии:
1. @Roger — Для определенных типов аналитики в SQL рекурсивные запросы являются королем. Изучите их. Их можно использовать для выполнения всевозможных забавных вещей.