2009-07-14 16 views
5

階層テーブル内で重複/重複値を検出しようとしています。階層SQLで重複/重複行を検索

は、以下の(やや不自然)の例を考えてみましょう:

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で実行します。

明確化が必要な場合はお知らせください。

EDIT :-)

ありがとう:0が存在する可能性があること

注... N値は、サブクエリから返されました。

答えて

-1

が、それは非常に簡単です: 、IN MGR WITH empSTART FROM

SELECT *(EMP FROM EMPNO SELECT WHERE ENAME = 'JONES' UNIONのempからすべての
SELECT EMPNO WHERE ENAME = 'JONES' )前に接続するempno = mgr;結果セットを複製する

+0

連合ALLは役立ちませんが....繰り返される値は、INの評価中にsurpressedされています。 – cagcowboy

0

1つの方法は、2つの列、つまり結果セットに(直積)、それに参加横断することです:あなたのケースで

SQL> WITH your_query AS (
    2  SELECT object_name 
    3  FROM all_objects WHERE ROWNUM <= 3 
    4 ) 
    5 SELECT your_query.* 
    6 FROM your_query 
    7 CROSS JOIN (SELECT NULL FROM dual UNION ALL SELECT NULL FROM dual); 

OBJECT_NAME 
------------------------------ 
IND$ 
IND$ 
ICOL$ 
ICOL$ 
OBJ$ 
OBJ$ 

これは動作するはずです:

WITH your_query AS (
    SELECT * 
    FROM emp 
    START WITH mgr IN (SELECT empno FROM emp WHERE ename = 'JONES') 
      CONNECT BY PRIOR empno = mgr 
) 
SELECT your_query.* 
    FROM your_query 
CROSS JOIN (SELECT NULL FROM dual UNION ALL SELECT NULL FROM dual); 
あなたはもみに必要のよう
3

これを試してみてください。..

SELECT EMPNO,ENAME FROM,count(*)as counts emp group by EMPNO,ENAME having count(*)>1 
+1

これは、 "having" SQLキーワードを使用して、このようなことを行う典型的な方法です。 – djangofan

0

サウンズempから複合選択クエリの結果への外部結合を行い、それに基づいて接続ベースのクエリーを作成します。多分このような

何か、:

 
WITH mgrs AS (
    SELECT empno FROM emp WHERE ename = 'JONES' 
    UNION ALL 
    SELECT empno FROM emp WHERE ename = 'JONES' 
), 
all_emps AS (
    SELECT emp.*, 
      CASE WHEN mgrs.empno IS NOT NULL THEN 1 END AS start_with 
    FROM emp 
    LEFT OUTER JOIN mgrs ON mgrs.empno = emp.mgr 
) 
SELECT * 
FROM all_emps 
START WITH start_with = 1 
CONNECT BY PRIOR empno = mgr;