postgreSQL中的递归查询?

时间:2014-02-10 10:27:51

标签: postgresql

我在这里查看了一些递归查询,但没有找到我的问题。除此之外,我是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位

1 个答案:

答案 0 :(得分:2)

这是一个非常简单的递归查询,当你在递归项中看到一个非空行时,你就停止了。

鉴于the following sample table

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(因为内连接不会添加任何行),迭代就会停止。