我在这里查看了一些递归查询,但没有找到我的问题。除此之外,我是postgreSQL的新手。
我有下表和示例数据:
number numberto ab st kz pv
112 200
140 210
200 210
210 220 f2 140 H 2011
220 f2 140 H 2011
查询会有点复杂,但这是我无法解决的部分。 numberto
指的是另一个number
,然后又可能。我可以认为这个链条持续大约四到五次。
有一天,其他四个颜色是NOT NULL
并填充了字母和/或数字。如果ab有内容,那么其他三个也有内容。如果填写了最后一个颜色,numberto
可以进一步引用,但将保持不变,因此它可以停在那里。
我的问题:我需要对一个数字进行递归查询,然后根据需要多次搜索numberto
,直到例如然后填充ab
并获得它们的输出。
我怎样才能做到这一点?
SELECT version();
x86_64-unknown-linux-gnu上的PostgreSQL 9.2.6,由gcc编译(SUSE Linux)4.3.4 [gcc-4_3-branch revision 152973],64位
答案 0 :(得分:2)
这是一个非常简单的递归查询,当你在递归项中看到一个非空行时,你就停止了。
WITH RECURSIVE chain AS
(
-- Start with the row with number=140
SELECT number, numberto, ab, st, kz, pv
FROM numbers n
WHERE n.number = 140
UNION ALL
-- and iteratively fetch the 'numberto' id'd row
SELECT n.number, n.numberto, n.ab, n.st, n.kz, n.pv
FROM chain c
INNER JOIN numbers n ON (c.numberto = n.number)
-- unless we've already found a non-null col in our last iteration
WHERE c.ab IS NULL
)
-- Find any non-null result.
SELECT *
FROM chain c
WHERE c.ab IS NOT NULL;
应该这样做,n.number = 140
是你的开始条件。
如果找到非空col,或者如果你有一个NULL numberto或不匹配的numberto(因为内连接不会添加任何行),迭代就会停止。