行間の関係がわからない場合、前の行のa and b
列と現在の行の合計を計算するにはどうすればよいですか。2 つの行の関係を見つけるために、テーブルにa column
さらに 2 つ作成しました。column id and parent
parent
は について説明する列でprevious row
、id
は行のprimary key
です。
create table test1 (a number ,b number ,c number ,id number ,parent number);
Insert into TEST1 (A, B, C, ID) Values (1, 2, 3, 1);
Insert into TEST1 (B, PARENT, ID) Values (6, 1, 2);
Insert into TEST1 (B, PARENT, ID) Values (4, 2, 3);
WITH recursive (a, b, c,rn) AS
(SELECT a,b,c,id rn
FROM test1
WHERE parent IS NULL
UNION ALL
SELECT (rec.a+ rec.b) a
,t1.b b
,(rec.a+ rec.b+t1.b) c
,t1.id rn
FROM recursive rec,test1 t1
WHERE t1.parent = rec.rn
)
SELECT a,b,c
FROM recursive;

は、後に続くサブクエリの名前を定義WITH keyword
しますrecursive
WITH 再帰 (a、b、c、rn) AS
次に、名前付きサブクエリの最初の部分が続きます
SELECT a,b,c,id rn
FROM test1
WHERE parent IS NULL
名前付きサブクエリは、UNION ALL
2 つのクエリの 1 つです。これは、最初のクエリであり、再帰の開始点を定義します。私の CONNECT BY クエリと同様に、最初のレコードが何であるかを知りたいです。
次は、最も混乱した部分です。
SELECT (rec.a+ rec.b) a
,t1.b b
,(rec.a+ rec.b+t1.b) c
,t1.id rn
FROM recursive rec,test1 t1
WHERE t1.parent = rec.rn
これがどのように機能するかです:
WITH クエリ: 1. 親クエリが実行されます。
SELECT a,b,c
FROM recursive;
- これにより、名前付きサブクエリの実行がトリガーされます。2 サブクエリの共用体の最初のクエリが実行され、再帰を開始するシード行が提供されます。
SELECT a,b,c,id rn
FROM test1
WHERE parent IS NULL
この場合のシード行は、親が null の id =1 の行になります。これ以降、シード行を「新しい結果」と呼びましょう。これは、まだ処理が完了していないという意味で新しいものです。
サブクエリの共用体の 2 番目のクエリが実行されます。
SELECT (rec.a+ rec.b) a
,t1.b b
,(rec.a+ rec.b+t1.b) c
,t1.id rn
FROM recursive rec,test1 t1
WHERE t1.parent = rec.rn