首页 > 解决方案 > 查询以获取给定父 ID 的子记录

问题描述

我有一个查询要从 Table2 中查找子数据,这些子数据具有在其他表中定义的分层数据,即 oracle 中的 TABLE1。

表格1

ID, CHILD_ID, PARENT_ID
1,  1           
2,  2,      1   
3,  3,      2   
4,  4,      3   
5,  5,      4   
6,  6,      4   
7,  7,      4   
8,  8,      5   
9,  9,      5   

表2

NAME,AGE,ID
JJ,22,1
XX,19,2
YY,20,3
KK,21,4
PP,18,5
CC,19,6
DD,22,7
SS,44,8
QQ,33,9

当我查询 ID 7 时,输出应该

NAME,AGE,ID
DD,22,7

因为没有 7 的孩子

当我查询 5 时,它应该在下面显示为 8 和 9 是 5 的孩子

NAME,AGE,ID
PP,18,5
SS,44,8
QQ,33,9

请建议,在此先感谢

标签: sqloracleinner-joinrecursive-query

解决方案


您可以执行以下操作来处理一般情况(即不仅会得到父母和孩子,而且可能会得到孩子的孩子等等)。

with thevalues as
(
 SELECT child, parent
 FROM table1 
 START WITH parent=4
 CONNECT BY PRIOR child = parent
)
SELECT *
FROM table2
WHERE id IN (SELECT child FROM thevalues UNION ALL SELECT parent FROM thevalues)

whereparent=4定义起始记录。Connect By用于这些分层查询。

尽管上述内容也适用于您示例中的简单案例,但如果您不关心孩子的孩子,您可能更喜欢类似的东西

SELECT *
FROM table2
WHERE id=4
UNION ALL
SELECT *
FROM table2
WHERE id IN
(
 SELECT child
 FROM table1
 WHERE parent=4
)

请注意,在此示例中,我在两个地方硬编码了 4。


推荐阅读