可能是糟糕的头衔,对不起。 情况就是这样:
用户表:
id
name
连接表:
id
master_id
slave_id
insert into Users values(1,'Jack');
insert into Users values(2,'Marc');
insert into Users values(3,'Susie');
insert into Users values(4,'Paul');
insert into Connections values(1,1,2);
insert into Connections values(2,3,1);
insert into Connections values(3,3,4);
通过上述插入,Jack将Marc作为奴隶。 但他也是苏西的奴隶。 甚至保罗也是苏西的奴隶。
现在我需要取出所有杰克奴隶的人。但我还需要获取杰克的主人和主人的奴隶。
在英语中,这意味着对于杰克我会得到表中的所有用户。因为马克是杰克的奴隶。苏西是杰克的主人。 保罗是苏西的奴隶(而苏西是杰克的主人,所以保罗在某种程度上也属于我所属的用户名单中。)
希望这很清楚。
是否可以在一个查询中获取所有这些内容? 现在有一个查询可以获取所有杰克的奴隶。我建造了一个让所有杰克的主人。但后来我需要循环每个主人来获得他所有的奴隶。所有这些都会产生至少3个查询。 因为我使用node.js和所有回调的东西,它不是一个很好的选择。 我在考虑UNION,但我不确定它是要走的路。还有存储过程,我宁愿避免它们。
实际上,使用UNION I可以选择Im slave和Im master的行。但我仍然不知道如何获取我的主人是master_id的那些行。
--- --- EDIT
我现在正在运行此查询:
select
"connections"."master_id"
,"connections"."slave_id"
from
"connections"
where
"connections"."master_id" = 1
union
select
"connections"."master_id"
,"connections"."slave_id"
from
"connections"
where
"connections"."slave_id" = 1
union
select
"connections"."master_id"
,"connections"."slave_id"
from
"connections"
where
"connections"."master_id" IN
(select "connections"."master_id" from "connections" where "connections"."slave_id" = 1)
它似乎给了我预期的结果。 在这种情况下,这将是表连接中的所有行。 你认为它看起来是否正确?
答案 0 :(得分:1)
这是递归CTE非常有用的场景类型。递归CTE是一种特殊的CTE,可以引用自身。我们使用它来遍历层次结构,而不是进行一堆自连接,当层次结构的深度在不同的路径上流动时,以及随着时间的推移,这通常是一个不好的选择。
{'atv': '10', 'ath': '20'}
Check out the official Postgres documentation on Recursive CTEs here