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の各行に1つの行があり、列LVLの値は1であり、テーブルAの各行に3つあり、列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
ID列の各値に対して、これらのクエリが12行を返す理由、またはLVLが2の行が3つあり、LVLが1の行が1つしかない理由がわかりません。
「接続」されているレベルの数を3に増やすと、IDの値ごとに13行が返されます。1(LVLが1の場合)、3(LVLが2の場合)、および9(LVLが3の場合)。これは、返される行が、LVLの値から1を引いた値の表Aの行数であることを示しているようです。
ただし、これらのクエリは次のクエリと同じで、6行が返されます。
select id, lvl
from ( select level as lvl
from dual
connect by level <= 2
)
cross join a
order by id, lvl
何が起こるべきかを説明する上で、ドキュメントは私には特に明確ではありません。これらの力で何が起こっているのか、そしてなぜ最初の2つのクエリが3番目のクエリと同じではないのですか?