最近、postgreSQL で再帰クエリを要求しました。答えはうまくいきましたが、JOIN要素を追加するとすぐに次のエラーが表示されます:
エラー: テーブル "n" の FROM 節エントリがありません: WITH RECURSIVE chain AS ( SELECT n.pordnr, pz.pordnrzu, n.abschl, n.stg, n.kzfa, n.pversion FROM pord n LEFT JOIN pordnrzu pz ON pz.pordnr = n.pordnr WHERE n.pordnr = 112 UNION ALL SELECT n.pordnr, pz2.pordnrzu, n.abschl, n.stg, n.kzfa, n.pversion FROM chain c LEFT JOIN pordnrzu pz2 ON pz2.pordnr = n.pordnr INNER JOIN pord n ON (c.pordnrzu = n.pordnr) WHERE c.abschl IS NULL ) SELECT * FROM chain c WHERE c.abschl IS NOT NULL
いくつかの変更を試みましたが、機能させることができません。私が欲しいのは、それpordnrzu
が別のものを探すために実装されていることだけpordnr
です。
だから:pordnr
- > pordnrzu
- >pordnr
見逃したものはありますか?
これはサンプルテーブルです:
CREATE TABLE pord (
pordnr integer primary key,
abschl text,
stg text,
kzfa text,
pversion text
);
INSERT INTO pord (pordnr, abschl, stg, kzfa, pversion)
VALUES
(112, NULL, NULL, NULL, NULL),
(140, NULL, NULL, NULL, NULL),
(200, NULL, NULL, NULL, NULL),
(210, 'f2', '140', 'H', '2011'),
(220, 'f2222', '140000', 'HHH', '201111');
CREATE TABLE pordnrzu (
pordnr integer primary key,
pordnrzu integer
);
INSERT INTO pordnrzu (pordnr, pordnrzu)
VALUES
(112, 140),
(140, 210),
(200, 220),
(210, 220),
(220, NULL);
そして、これは私のクエリです:
WITH RECURSIVE chain AS
(
SELECT n.pordnr, pz.pordnrzu, n.abschl, n.stg, n.kzfa, n.pversion
FROM pord n
LEFT JOIN pordnrzu pz
ON pz.pordnr = n.pordnr
WHERE n.pordnr = 112
UNION ALL
SELECT n.pordnr, pz2.pordnrzu, n.abschl, n.stg, n.kzfa, n.pversion
FROM chain c
LEFT JOIN pordnrzu pz2
ON pz2.pordnr = n.pordnr
INNER JOIN pord n ON (c.pordnrzu = n.pordnr)
WHERE c.abschl IS NULL
)
SELECT *
FROM chain c
WHERE c.abschl IS NOT NULL;
私の目的は、最初のエントリーpordnr=112
がpordnrzu
pordnr
abschl NOT NULL
この例では、ソリューションは次の行になります。
pordnr pordnrzu abschl stg kzfa pversion
200 210 f2 140 H 2011
SELECT version();
x86_64-unknown-linux-gnu 上の PostgreSQL 9.2.6、gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch リビジョン 152973]、64 ビットでコンパイル