我正在尝试检测分层表中的重复/重复值。
考虑以下(稍微做作的)示例:
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;
返回...
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
我真正想要的是...
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
即我希望每一行返回子查询中存在的次数(忽略顺序)。由于 START WITH 使用的是 IN 子句,因此重复值被抑制。是否可以重新组织 SQL 以便我可以做到这一点?
请注意,在我的情况下,子条款不是 UNION,而是一个 SELECT,它可以从表中返回多个(可能是重复的)值。
我可以通过将值写入临时表然后进行 GROUPing + COUNTing 来在 PL/SQL 中执行此操作,但我更愿意仅在可能的情况下在 SQL 中执行此操作。
让我知道是否需要任何澄清。
谢谢 :-)
编辑:
请注意,子查询可能返回 0...N 个值。