CONNECT BY
の方法 クエリが実行され、評価されます-ステップバイステップ(例)。
次のテーブルとクエリによる接続があるとします。
select * from mytable;
X
----------
1
2
3
4
SELECT level, m.*
FROM mytable m
START with x = 1
CONNECT BY PRIOR x +1 = x OR PRIOR x + 2 = x
ORDER BY level;
ステップ1:
テーブルmytable
から行を選択します START WITH
を満たす 条件として、返された結果セットにLEVEL =1を割り当てます:
CREATE TABLE step1 AS
SELECT 1 "LEVEL", X from mytable
WHERE x = 1;
SELECT * FROM step1;
LEVEL X
---------- ----------
1 1
ステップ2
レベルを1上げる:
LEVEL = LEVEL + 1
前の手順で返された結果セットをmytable
で結合します CONNECT BY
を使用する 結合条件としての条件。
この句では、PRIOR column-name
前の手順で返された結果セットを参照し、単純なcolumn-name
mytable
を指します テーブル:
CREATE TABLE step2 AS
SELECT 2 "LEVEL", mytable.X from mytable
JOIN step1 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step2;
LEVEL X
---------- ----------
2 2
2 3
ステップx+1
最後の操作で空の結果セットが返されるまで、#2を繰り返します。
ステップ3
CREATE TABLE step3 AS
SELECT 3 "LEVEL", mytable.X from mytable
JOIN step2 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step3;
LEVEL X
---------- ----------
3 3
3 4
3 4
ステップ4
CREATE TABLE step4 AS
SELECT 4 "LEVEL", mytable.X from mytable
JOIN step3 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step4;
LEVEL X
---------- ----------
4 4
ステップ5
CREATE TABLE step5 AS
SELECT 5 "LEVEL", mytable.X from mytable
JOIN step4 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step5;
no rows selected
ステップ5は行を返さなかったので、クエリを完成させます
最後のステップ
UNION ALL
すべてのステップの結果を返し、最終結果として返します:
SELECT * FROM step1
UNION ALL
SELECT * FROM step2
UNION ALL
SELECT * FROM step3
UNION ALL
SELECT * FROM step4
UNION ALL
SELECT * FROM step5;
LEVEL X
---------- ----------
1 1
2 2
2 3
3 3
3 4
3 4
4 4
次に、上記の手順をクエリに適用しましょう。
SELECT * FROM dual;
DUMMY
-----
X
SELECT LEVEL FROM DUAL CONNECT BY rownum>5;
ステップ1
クエリにSTART WITH
が含まれていないため 句、Oracleはソーステーブルからすべてのレコードを選択します:
CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;
select * from step1;
LEVEL
----------
1
ステップ2
CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5
select * from step2;
no rows selected
最後のステップで行が返されなかったため、クエリを完成させます。
最後のステップ
SELECT * FROM step1
UNION ALL
SELECT * FROM step2;
LEVEL
----------
1
最後のクエリの分析:
select level from dual connect by rownum<10;
宿題としてお任せします。