在分层sql中查找重复/重复的行

cag*_*boy 5 sql oracle hierarchical-data

我正在尝试检测分层表中的重复/重复值.

考虑以下(略微做作)的例子:

SELECT *
FROM   emp
START WITH mgr IN (SELECT empno FROM emp WHERE ename = 'JONES'
                   UNION ALL
                   SELECT empno FROM emp WHERE ename = 'JONES')
CONNECT BY PRIOR empno = mgr;
Run Code Online (Sandbox Code Playgroud)

返回...

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
Run Code Online (Sandbox Code Playgroud)

我真正想要的是......

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
Run Code Online (Sandbox Code Playgroud)

即我希望每行返回的次数与子查询中存在的次数相同(忽略顺序).由于START WITH使用IN子句,因此重复的值被抑制.是否可以重新组织SQL以便我可以这样做?

请注意,在我的情况下,子句不是UNION,而是一个SELECT,它可以从表中返回多个(可能是重复的)值.

我可以在PL/SQL中通过将值写入临时表然后进行GROUPing + COUNTing来实现,但我更愿意在SQL中尽可能地执行此操作.

如果需要澄清,请告诉我.

谢谢 :-)

编辑:

请注意,子查询可能返回0 ... N个值.

Kov*_*ovu -1

这很简单:

SELECT *FROM empSTART WITH mgr IN (SELECT empno FROM emp WHERE ename = 'JONES' UNION ALL
SELECT empno FROM emp WHERE ename = 'JONES')CONNECT BY PRIOR empno = mgr;