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 节点扩展
第一部分很简单:
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)
我的节点图结构如下所示
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 节点扩展第一部分很简单:
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)