Postgres查询以获取主服务器和从服务器

时间:2016-09-29 15:02:22

标签: sql postgresql

可能是糟糕的头衔,对不起。 情况就是这样:

用户表:

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)        

它似乎给了我预期的结果。 在这种情况下,这将是表连接中的所有行。 你认为它看起来是否正确?

1 个答案:

答案 0 :(得分:1)

这是递归CTE非常有用的场景类型。递归CTE是一种特殊的CTE,可以引用自身。我们使用它来遍历层次结构,而不是进行一堆自连接,当层次结构的深度在不同的路径上流动时,以及随着时间的推移,这通常是一个不好的选择。

{'atv': '10', 'ath': '20'}

Check out the official Postgres documentation on Recursive CTEs here