关于oracel 递归语法start with connect by 和 left join 一起使用的一个bug

发布时间 2023-04-26 09:43:02作者: moonsoft

左表为树状结构机构表A,右表为人员表(有机构ID字段)B

SELECT A.*, B.*
  FROM A
  LEFT JOIN B
    ON A.ORG_ID = B.ORG_ID
 START WITH A.ORG_ID = '011000000004'
CONNECT BY PRIOR A.ORG_ID = A.P_ORG_ID

查询结果出现,B表中的1条记录,最后重复出现。(最终的结果可能为:对 A 和 B 连接后的临时表,进行递归查询)因为B表中某一个机构ID的记录有多条,导致连接后,该ID的记录有多条,进行了多次递归,导致重复出现?

 

解决方法,先用with as 临时表对A,先做递归,然后再左连接B

WITH TMP_ORG AS
 (SELECT *
    FROM A
   START WITH A.ORG_ID = '011000000004'
  CONNECT BY PRIOR A.ORG_ID = A.P_ORG_ID)
SELECT T.*, B.* FROM TMP_ORG T LEFT JOIN B ON T.ORG_ID = B.ORG_ID