2016-06-15 8 views
1

私のOracleデータベースには、TEMP_HRとPAY_SLIP_APR_16の2つのテーブルがあります。どちらもEMP_IDという共通の列を持ちます。 TEMP_HRには10,000件以上のレコードがあり、PAY_SLIP_APR_16には約6,000件のレコードがあります。 PAY_SLIP_APR_16のEMP_IDがTEMP_HRとどれくらい一致するかを知りたい。いずれかのIDが一致しない場合は、それを印刷します。そして私の簡単なアプローチはここにありますが、私は非常に悪いアプローチだと思います。だから、もっと速い方法?2つのテーブルから1つの列を取り出して比較する

DECLARE 
    INPUT_EMP_NO VARCHAR2(13 BYTE); 
    INPUT_EMP_ID VARCHAR2(13 BYTE); 
    ROW_COUNT_1 NUMBER(6,0); 
    ROW_COUNT_2 NUMBER(6,0); 
    MATCHED_ID NUMBER; 
    UNMATCHED_ID NUMBER; 

BEGIN 

    ROW_COUNT_1:=0; 
    ROW_COUNT_2:=0; 
    MATCHED_ID:=0; 
    UNMATCHED_ID:=0; 
    SELECT COUNT(*) INTO ROW_COUNT_1 FROM PAY_SLIP_APR_16; 
    SELECT COUNT(*) INTO ROW_COUNT_2 FROM TEMP_HR; 
    FOR A IN 1..ROW_COUNT_1 LOOP 
    BEGIN 
     SELECT EMP_ID INTO INPUT_EMP_ID FROM (SELECT EMP_ID, ROWNUM AS RN FROM PAY_SLIP_APR_16) WHERE RN=A; 
     FOR B IN 1..ROW_COUNT_2 LOOP 
      SELECT EMP_NO INTO INPUT_EMP_NO FROM (SELECT EMP_NO, ROWNUM AS RON FROM TEMP_HR) WHERE RON=B; 
      IF(INPUT_EMP_ID=INPUT_EMP_NO)THEN 
       MATCHED_ID:=MATCHED_ID+1; 
       EXIT; 
      ELSE 
       CONTINUE; 
      END IF; 
     END LOOP; 
     UNMATCHED_ID:=UNMATCHED_ID+1; 
     DBMS_OUTPUT.PUT_LINE(INPUT_EMP_ID); 
     EXCEPTION 
      WHEN OTHERS THEN 
       DBMS_OUTPUT.PUT_LINE(INPUT_EMP_ID||' -> '||SQLERRM); 
    END; 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('MATCHED -> '||MATCHED_ID); 
    DBMS_OUTPUT.PUT_LINE('UNMATCHED -> '||UNMATCHED_ID); 
END; 

答えて

0

SQLセットを使用する必要があります。

TEMP_HRにあなたはこの試みるかもしれないあるEMP_ID確認するには:その後、他の方法で回避

select EMP_ID FROM PAY_SLIP_APR_16 
where EMP_ID not in (select EMP_NO from TEMP_HR); 

を:

select EMP_NO FROM TEMP_HR 
where EMP_NO not in (select EMP_ID from PAY_SLIP_APR_16); 
2

逃し参加するためのフィルタリングを外部結合を使用します。

select p.* 
from PAY_SLIP_APR_16 p 
left join TEMP_HR t on t.EMP_ID = p.EMP_ID 
where t.EMP_ID is null 

インデックスがTEMP_HR(EMP_ID)の場合、このクエリはfまあ。

関連する問題