PostgreSQL选择child_id作为parent_id



我有一个节点的图结构,看起来像这个

1
|---------|---------|
2                   3
|-----|-----|       |-----|-----|
4           5       6           7

我将结构的关系作为存储在SQL数据库中

====== node table =======
id | parent_id | child_id
-------------------------
1  |     1     |     2
2  |     1     |     3
3  |     2     |     4
4  |     2     |     5
5  |     3     |     6
6  |     3     |     7

我想作为查询这些关系

====== node table =======
parent_id | child_id
-------------------------
1     |     2
1     |     3
2     |     4
2     |     5
3     |     6
3     |     7
4     |    null
5     |    null
6     |    null
7     |    null

目前,我正在尝试在子部分使用UNION来连接记录。

select
t.parent_id ,
t.child_id 
from
table t
union
select 
t2.child_id ,
null,
null
from
table t2
where
t22.child_id not in (
select
distinct t3.parent_id
from
table t3)

我想知道是否有更好的方法来实现这一点?

这很简单:

SELECT A.parent_id, B.child_id 
FROM (
SELECT parent_id FROM test
UNION 
SELECT child_id FROM test
) AS A
LEFT JOIN test AS B ON A.parent_id = B.parent_id

首先获取所有图形节点ID(父节点和子节点(,然后尝试查找每个父节点的所有子节点。

如果我没看错,您只想查询原始表,该表由没有自己子节点的子节点扩展。

演示:db<gt;小提琴

第一部分很简单:

SELECT parent_id, child_id FROM mytable

第二部分是查询所有未出现在parent_id列中的子项:

SELECT child_id
FROM mytable
WHERE child_id NOT IN (SELECT parent_id FROM nodes)

两个查询都可以使用UNION:进行组合

SELECT parent_id, child_id FROM nodes
UNION
SELECT child_id, null 
FROM nodes
WHERE child_id NOT IN (SELECT parent_id FROM nodes)

相关内容

最新更新