查询以获取给定父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

请建议,提前感谢

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

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)

其中CCD_ 1定义了起始记录。"连接方式"用于此类分层查询。

尽管以上内容也适用于您的示例中的简单情况,但如果您不关心儿童的子女,您可能更喜欢之类的内容

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

注意,在本例中,我在两个地方对4进行了硬编码。

如果您只想要直属子项,那么exists子查询就足够了:

select t2.*
from table2 t2
where exists (
select 1 from table1 t1 where t1.child_id = t2.id and 5 in (t1.child_id, t1.parent_id)
)

或者:

select t2.*
from table2 t2
where t2.id = 5 or exists (
select 1 from table1 t1 where t1.child_id = t2.id and t1.parent_id = 5
)

另一方面,如果你想要所有的孩子,无论他们的级别如何,那么我建议使用递归查询:

with cte (child_id, parent_id) as (
select child_id, parent_id from table1 where child_id = 5
union all
select t1.child_id, t1.parent_id
from cte c
inner join table1 t1 on t1.parent_id = c.child_id
)
select t2.*
from table2 t2
where exists (select 1 from cte c where c.child_id = t2.id)

您可以使用类似这样的查询来查找合适的子项。只需将您在CONNECT_BY_ROOT (t1.id) = 5子句中搜索的ID从5更改为任意ID,它就会按预期工作。

SELECT t2.name, t2.age, t1.id
FROM table1 t1, table2 t2
WHERE t1.id = t2.id AND CONNECT_BY_ROOT (t1.id) = 5
CONNECT BY PRIOR t1.id = t1.parent_id;

相关内容

  • 没有找到相关文章

最新更新