我正在尝试编写一个查询,该查询从指定值开始直到整个条件为真都“循环”通过数据库。例如,假设我在TABLE示例中具有以下条目:

id, parent, cond
1,        , True
2, 1      , False
3, 1      , False
4, 2      , False
... ... ...

我想要一个将输入(例如)4作为输入并将返回值2和1的查询。该过程是查询与id匹配,并且如果cond == False,将查看父级(id = 2 )。由于第二行中的cond = False,因此将选择“父代” ID(1)。现在看第一行,因为cond = True,所以LOOP结束并返回1和2。

我知道查询
SELECT parent FROM example WHERE id = 4;

会产生父代编号2。

所以我徒劳地尝试创建一个LOOP:
WHILE (SELECT cond FROM example) = False
LOOP SELECT parent FROM example WHERE id = 4
END LOOP;

首先,这将产生一个错误(“'while'或附近的语法错误”)。其次,我不知道每次迭代后如何更新“id”。

在像Python这样的编程语言中,我可能会使用一个初始化为4的变量,然后在每次迭代时对其进行更新...不确定如何在Postgres中进行等效操作。

如果您有任何疑问或需要其他信息,请告诉我。谢谢!

最佳答案

您的想法对SQL是错误的。不要以循环,条件和变量来思考;相反,请考虑如何描述所需的数据。棘手的部分是您希望查询引用其自身的结果,这就是recursive CTEs的作用:



您正在寻找这样的东西:

with recursive path as (
    select id, parent from T where id = 4
    union all
    select t.id, t.parent from T t join path p on t.id = p.parent
)
select id, parent
from path

这将为您提供:
 id | parent
----+--------
  4 |      2
  2 |      1
  1 |

然后您可以将它们放回数据库外部的链接列表(或客户端语言中合适的任何东西)中的路径。您当然不必包括parent,但包括它可以帮助您修复“指针”。

关于postgresql - PostgreSQL:循环直到条件为真,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11840449/

10-11 05:52
查看更多