Я пытаюсь обнаружить дублированные / повторяющиеся значения в иерархической таблице.
Рассмотрим следующий (слегка надуманный) пример:
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;
Returns ...
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, который может возвращать несколько (возможно, повторяющихся) значений из таблицы.
Я мог бы сделать это в PL / SQL, записав значения во временную таблицу и затем GROUPing + COUNTing, но я бы предпочел сделать это в SQL, только если это возможно.
Дайте мне знать, если требуется какое-либо разъяснение.
Спасибо: -)
EDIT:
Обратите внимание, что из подзапроса может быть 0 ... N значений.