首页 > 解决方案 > 在表中查找所有父母或孩子

问题描述

我有如下表:

parent_id child_id
2 5
3 9
3 5
8 9
8 33
8 18
8 17
9 22
22 4
22 11
38 9

我想要在 sql 中返回所有相关值的查询或过程,例如,如果用户输入 9 输出为:38、8、3、22、9、17、33、18、5、11, 4

我目前的查询是:

Formatted on 9/15/9091 9:59:59 AM (QP5 v5.390) */
WITH
Parents
AS
    (SELECT YT.child_id, YT.PARENT_ID
       FROM ARTAPAY_TEMP.REL_TEST YT
      WHERE YT.child_id = 6
     UNION ALL
     SELECT YT.CHILD_ID, YT.PARENT_ID
       FROM ARTAPAY_TEMP.REL_TEST  P
            JOIN ARTAPAY_TEMP.REL_TEST YT ON P.PARENT_ID = YT.CHILD_ID),
Children
AS
    (SELECT YT.CHILD_ID, YT.PARENT_ID
       FROM ARTAPAY_TEMP.REL_TEST YT
      WHERE YT.CHILD_ID = 6
     UNION ALL
     SELECT YT.CHILD_ID, YT.PARENT_ID
       FROM ARTAPAY_TEMP.REL_TEST  C
            JOIN ARTAPAY_TEMP.REL_TEST YT ON C.CHILD_ID = YT.PARENT_ID)
SELECT child_id, Parent_ID
FROM Parents P
UNION ALL
SELECT child_ID, Parent_ID
fROM Children C
 WHERE C.child_ID != 6

标签: sqloracleplsql

解决方案


首先,您的查询不是递归的。在递归 CTE 中,查询引用自身,例如with cte (x) as (select x from t union all select x + 1 from **cte** join t on t.x = cte.x + 1.

那么你不是在寻找一个 ID 的父母和孩子,就像标题所暗示的那样,而是寻找包括所有兄弟姐妹在内的整个家谱。您希望结果中的 ID 33 既不是 ID 9 的父级也不是子级,但 ID 9 和 ID 33 都具有相同的父 ID 8。

with cte (id) as
(
  select parent_id from mytable where 9 in (child_id, parent_id)
  union all
  select case when c.id = t.parent_id then t.child_id else t.parent_id end
  from mytable t
  join cte c on c.id in (t.child_id, t.parent_id)
)
cycle id set is_cycle to 1 default 0
select distinct id from cte;

演示:https ://dbfiddle.uk/?rdbms=oracle_18&fiddle=8e4ec2500ffbfcc886a15635dfa66d6d


推荐阅读