Dav*_*d C 5 postgresql loops while-loop postgresql-9.1
我试图编写一个查询,它从一个数据库"循环"开始于指定的值,直到条件为真.例如,假设我在TABLE示例中有以下条目:
id, parent, cond
1, , True
2, 1 , False
3, 1 , False
4, 2 , False
... ... ...
Run Code Online (Sandbox Code Playgroud)
我想要一个查询作为输入(例如)4,并将返回值2和1.过程是查询匹配id,如果cond == False,将查看父项(id = 2) ).由于第二行中cond = False,因此将选择"父"id(1).现在看第一行,因为cond = True,LOOP结束并返回1和2.
我知道查询
SELECT parent FROM example WHERE id = 4;
Run Code Online (Sandbox Code Playgroud)
将生成父ID 2.
所以我徒劳地尝试创建一个循环:
WHILE (SELECT cond FROM example) = False
LOOP SELECT parent FROM example WHERE id = 4
END LOOP;
Run Code Online (Sandbox Code Playgroud)
首先,这会产生错误("语法错误在'或'附近'').其次,我不知道如何在每次迭代后更新"id".
在像Python这样的编程语言中,我可能会使用一个初始化为4的变量,然后在每次迭代时更新它...不确定如何在Postgres中执行等效操作.
如果您有任何疑问或需要其他信息,请与我们联系.谢谢!
mu *_*ort 10
您对SQL的想法是错误的.不要考虑循环,条件和变量; 相反,考虑如何描述您想要的数据.棘手的部分是你希望查询引用它自己的结果,这就是递归CTE的用途:
可选
RECURSIVE
修饰符WITH
从仅仅是语法上的便利变为一种功能,可以完成标准SQL中不可能实现的功能.使用时RECURSIVE
,WITH
查询可以引用自己的输出.
你正在寻找这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
这会给你这个:
id | parent
----+--------
4 | 2
2 | 1
1 |
Run Code Online (Sandbox Code Playgroud)
然后你可以把它放回到一个路径中,这个路径在数据库之外会更加link-listy(或者你的客户语言中适合的任何东西).当然,您不必parent
包括它,但包括它将帮助您修复"指针".
归档时间: |
|
查看次数: |
3898 次 |
最近记录: |