现有一张表test含两个字段idA和idB,如何使用一个sql实现将两个字段所有有关联的id作为一个集合输出。
例:
idA    idB
A      B
B      A
B      D
D      G
F      H
F      J
预期结果:
No    id
1       A
1       B
1       D
1       G
2       F
2       H
2       J 使用:WITH xxx AS(
    ...
    union all
    ...
)select * from xxx;时会出现大量重复数据,有没有什么解决办法?

解决方案 »

  1.   

    不想有重复就别用union all,用union
      

  2.   


    递归只能用union all
      

  3.   

    这里是Oracle,到DB2去问下更好。
      

  4.   

    help。。
      

  5.   

    不知道你咋递归的, 可能CTE递归有更好的办法
    WITH TMP AS
     (SELECT 'A' AS ID1, 'B' AS ID2
      FROM   DUAL
      UNION ALL
      SELECT 'B' AS ID1, 'A' AS ID2
      FROM   DUAL
      UNION ALL
      SELECT 'B' AS ID1, 'D' AS ID2
      FROM   DUAL
      UNION ALL
      SELECT 'D' AS ID1, 'G' AS ID2
      FROM   DUAL
      UNION ALL
      SELECT 'F' AS ID1, 'H' AS ID2
      FROM   DUAL
      UNION ALL
      SELECT 'F' AS ID1, 'J' AS ID2
      FROM   DUAL)
    SELECT ID1, DENSE_RANK() OVER(ORDER BY MIN(R)) RN
    FROM   (SELECT ID1, ID2, CONNECT_BY_ROOT(ID1) R
             FROM   TMP T
             CONNECT BY NOCYCLE PRIOR ID1 = ID2
             UNION ALL
             SELECT ID2, ID1, CONNECT_BY_ROOT(ID1) R
             FROM   TMP T
             CONNECT BY NOCYCLE ID1 = PRIOR ID2) 
    GROUP  BY ID1