階層テーブル内の重複/反復値を検出しようとしています。
次の (少し不自然な) 例を考えてみましょう。
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 であることに注意してください。
PL/SQL で値を一時テーブルに書き込んでから GROUPing + COUNTing を実行することもできますが、可能であれば SQL でのみ行うことをお勧めします。
明確化が必要な場合はお知らせください。
ありがとう :-)
編集:
サブクエリから返される 0...N の値が存在する可能性があることに注意してください。