通過SQL查詢兩張表中不匹配的行

feelpurple發表於2016-02-25
--建立測試資料

create table employees_act as
select employee_id,first_name,last_name from hr.employees where employee_id in(102,105,112,118,119,205) order by employee_id;

create table employees_new as
select employee_id,first_name,last_name from hr.employees where employee_id in(101,105,112,171,201) order by employee_id;

SQL> select * from employees_new;

EMPLOYEE_ID FIRST_NAME           LAST_NAME
----------- -------------------- -------------------------
        101 Neena                Kochhar
        105 David                Austin
        112 Jose Manuel          Urman
        171 William              Smith
        201 Michael              Hartstein

SQL> select * from employees_act;

EMPLOYEE_ID FIRST_NAME           LAST_NAME
----------- -------------------- -------------------------
        102 Lex                  De Haan
        105 David                Austin
        112 Jose Manuel          Urman
        118 Guy                  Himuro
        119 Karen                Colmenares
        205 Shelley              Higgins

--查詢兩張表中不匹配的行

SQL> select employee_id,
  2         first_name,
  3         last_name,
  4         count(act_emp_src) act_emp_row_cnt,
  5         count(new_emp_src) new_emp_row_cnt
  6    from (select ea.*, 1 act_emp_src, NULL new_emp_src
  7            from employees_act ea
  8          union all
  9          select en.*, NULL act_emp_src, 1 new_emp_src from employees_new en)
 10   group by employee_id, first_name, last_name
 11  having count(act_emp_src) != count(new_emp_src);

EMPLOYEE_ID FIRST_NAME           LAST_NAME                 ACT_EMP_ROW_CNT NEW_EMP_ROW_CNT
----------- -------------------- ------------------------- --------------- ---------------
        101 Neena                Kochhar                                 0               1
        205 Shelley              Higgins                                 1               0
        102 Lex                  De Haan                                 1               0
        171 William              Smith                                   0               1
        201 Michael              Hartstein                               0               1
        118 Guy                  Himuro                                  1               0
        119 Karen                Colmenares                              1               0

--上面的查詢方法兩個表中所有列進行分組,每行返回兩個 COUNT 值,對這兩個 COUNT 值進行比對。 
--加上 NULL 構造一列,是因為在 Oracle 中, COUNT 函式對含有 NULL 的列會統計成 0。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26506993/viewspace-1994635/,如需轉載,請註明出處,否則將追究法律責任。

相關文章