我有一个节点的图结构,看起来像这个
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)