从2个表中挑选1列并进行比较

时间:2016-06-15 06:14:58

标签: oracle plsql

在我的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不匹配,则打印它。这是我的简单方法,但我认为这是一个非常糟糕的方法。那么更快的方法呢?

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;

2 个答案:

答案 0 :(得分:2)

对错过的联接使用外部联接筛选:

iris_name_entry

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 上的索引会使此查询飞行。

答案 1 :(得分: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);

然后反过来说:

var parent = db.tblParents.Find(1);
db.Entry(parent).Collection(p => p.tblChildren).Query().
    Where(child => child.IsActive).Load();