查找 table 中的所有父项或子项

find all parent or child in table

我有 table 如下所示:

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 中的查询或过程 return 所有与 ID 相关的值(直接或间接) 例如,如果用户输入 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

首先你的查询不是递归的。在递归 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的parents和children,正如标题所暗示的那样,而是在寻找包括所有兄弟姐妹在内的整个家谱。您希望结果中的 ID 33 既不是 parent 也不是 child 到 ID 9,但 ID 9 和 ID 33 具有相同的 parent 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