2016-06-15 31 views
1

在我的Oracle數據庫中有兩個表,分別是TEMP_HR和PAY_SLIP_APR_16。他們都有一個名爲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集!

要檢查哪些EMP_IDTEMP_HR你可以試試這個:

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 LY。

相關問題