Возврат нескольких строк из одного запроса на основе значения столбца - PullRequest
1 голос
/ 28 октября 2011

Допустим, у меня есть эта таблица:

|Fld | Number|
 1     5
 2     2

И я хочу сделать выборку, которая извлекает столько Fld, сколько в поле Number:

|Fld |
 1
 1
 1
 1
 1
 2
 2

Как мне этого добиться? Я думал о создании временной таблицы и вставки данных на основе Number, но мне было интересно, можно ли это сделать с помощью одного оператора Select.

PS: я новичок в SQL

Ответы [ 3 ]

3 голосов
/ 28 октября 2011

Вы можете объединиться с таблицей чисел:

SELECT Fld
FROM yourtable
JOIN Numbers
ON yourtable.Number <= Numbers.Number

Таблица чисел - это просто таблица со списком чисел:

 Number
 1
 2
 3
 etc...
2 голосов
/ 28 октября 2011

Не очень удачное решение (поскольку вы по-прежнему запрашиваете таблицу дважды, но, возможно, вы сможете с ней работать)

    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

Он генерирует максимальное количество необходимых строк и затем фильтрует его по каждой строке.

2 голосов
/ 28 октября 2011

Я не знаю, поддерживает ли это ваша версия СУБД (хотя я, скорее, подозреваю, что это так), но вот рекурсивная версия:

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                     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...