Возврат нескольких строк из одного запроса на основе значения столбца

#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 рекурсивные запросы являются королем. Изучите их. Их можно использовать для выполнения всевозможных забавных вещей.