Использование CONNECT BY LEVEL, похоже, возвращает слишком много строк при выполнении на столе. Какова логика того, что происходит?
Предполагая следующую таблицу:
create table a ( id number );
insert into a values (1);
insert into a values (2);
insert into a values (3);
Этот запрос возвращает 12 строк (SQL Fiddle).
select id, level as lvl
from a
connect by level <= 2
order by id, level
Одна строка для каждой из таблиц A со значением столбца LVL составляет 1 и три для каждого в таблице A, где столбец LVL равен 2, то есть:
ID | LVL ---+----- 1 | 1 1 | 2 1 | 2 1 | 2 2 | 1 2 | 2 2 | 2 2 | 2 3 | 1 3 | 2 3 | 2 3 | 2
Он эквивалентен этому запросу, который возвращает те же результаты.
select id, level as lvl
from dual
cross join a
connect by level <= 2
order by id, level
Я не понимаю, почему эти запросы возвращают 12 строк или почему есть три строки, где LVL равно 2, и только один, где LVL равен 1 для каждого значения столбца ID.
Увеличение количества уровней, "подключенных" к 3 возвращает 13 строк для каждого значения ID. 1, где LVL равен 1, 3, где LVL равен 2 и 9, где LVL равно 3. Это, по-видимому, указывает на то, что возвращаемые строки представляют собой количество строк в таблице A для мощности значения LVL минус 1.
Я бы хотел, чтобы эти запросы были такими же, как и следующие: 6 строк
select id, lvl
from ( select level as lvl
from dual
connect by level <= 2
)
cross join a
order by id, lvl