递归 SQL 检索所有级别

Recursive SQL retrieve all levels

使用 Oracle 的递归方法时,我无法检索到我的查询所需的结果:

ID1     ID2
1       2
1       3
4       2
4       3
4       5

查询:

select sys_connect_by_path(id2,' -> ')
FROM Foo
  START WITH id1 = 1
  CONNECT BY PRIOR id1 = id2
ORDER BY 1;

仅输出 1 级层次结构 (2,3)。我希望它检测树( 1 -> (2,3) -> 4 -> 5 ),以便选择不同的 ID2 产生(2,3,5)。谢谢你。

如果您使用的是 Oracle 11.2 或更高版本,CTE(通用 Table 表达式)优于使用 Oracle 的 CONNECT BY 语句。

WITH
    aset -- Create pseudo table with ID2 as ID1 and vice versa
    AS
        (SELECT id1, id2
           FROM (SELECT id1, id2
                   FROM foo
                 UNION
                 SELECT id2, id1
                   FROM foo)
          WHERE id1 < id2),
    bset (id1, id2) -- Extract hierarchy from pseudo table
    AS
        (SELECT id1, id2
           FROM aset
          WHERE id1 = 1
         UNION ALL
         SELECT aset.id1, aset.id2
           FROM bset INNER JOIN aset ON bset.id2 = aset.id1
          WHERE bset.id1 <> aset.id2)
  SELECT DISTINCT bset.id2  -- Only keep values that were originally ID2
    FROM bset INNER JOIN foo ON bset.id2 = foo.id2
ORDER BY id2;

这里使用 CONNECT BY

也是一样的
WITH
    aset
    -- Create pseudo table with ID2 as ID1 and vice versa
    AS
        (SELECT id1, id2
           FROM (SELECT id1, id2
                   FROM foo
                 UNION
                 SELECT id2, id1
                   FROM foo)
          WHERE id1 < id2),
    bset
    -- Extract hierarchy from pseudo table
    AS
        (    SELECT id2
               FROM aset
         START WITH id1 = 1
         CONNECT BY PRIOR id2 = id1)
  SELECT DISTINCT bset.id2
    -- Only keep values that were originally ID2
    FROM bset INNER JOIN foo ON bset.id2 = foo.id2
ORDER BY id2