PostgreSQL select child_id 作为 parent_id

PostgreSQL select child_id as 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(包括父节点和子节点)- 然后尝试为每个父节点查找所有子节点。

如果我没看错的话,您只想查询原始的 table,由没有自己的 child.

的 child 节点扩展

demo:db<>fiddle

第一部分很简单:

SELECT parent_id, child_id FROM mytable

第二部分是查询所有没有出现在parent_id列的children:

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)