我正在尝试编写一个查询,该查询从指定值开始直到整个条件为真都“循环”通过数据库。例如,假设我在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/