【发布时间】:2014-02-18 14:06:10
【问题描述】:
我最近在 postgreSQL 中请求recursive query。答案很合适,但是一旦我添加了一个 JOIN 元素,它就会给我以下错误:
错误:表“n”缺少 FROM 子句条目:WITH RECURSIVE 链 作为(选择 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 从链 c 左连接 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 空
我尝试了几次修改,但无法使其正常工作。我想要的是,正在实施 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 revision 152973] 编译,64 位
【问题讨论】:
标签: sql postgresql join recursive-cte