ITPub博客

首页 > 数据库 > Oracle > 通过SQL查找两张表中不匹配的行

通过SQL查找两张表中不匹配的行

原创 Oracle 作者:feelpurple 时间:2016-02-25 17:41:24 0 删除 编辑
--创建测试数据

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博客 ” ,链接:https://blog.itpub.net/26506993/viewspace-1994635/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-08-01

  • 博文量
    404
  • 访问量
    1673951