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;