表数据比较 - Oracle

时间:2015-02-03 20:01:26

标签: c# sql asp.net oracle

我有两个具有相同列的相同数据的表。其中一个表中的数据可能会更新,我需要显示数据比较。结果数据集应仅包含新行,已删除或已修改的行。 请考虑以下数据。

表1数据

EmployeeId  EmployeeName

10001       Ned Stark
10002       Jon Snow
10003       Robb Stark

表2数据

EmployeeId  EmployeeName

10001       Eddard Stark
10002       Jon Snow
10004       Arya Stark

数据比较结果(采用以下格式):

EmployeeId1 EmployeeName1 EmployeeId2 EmployeeName2

10001       Ned Stark     10001       Eddard Stark
10003       Robb Stark    NULL        NULL
NULL        NULL          10004       Arya Stark

我怎样才能达到这个效果?我考虑过使用连接,但我担心性能。此外,密钥可以不是简单的数字密钥,它也可以是包括2个或更多列的复合密钥。以所需格式实现这种比较的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

即使左侧或右侧缺失,Een full join也会返回一行:

select  *
from    Table1 e1
full join
        Table2 e2
on      e1.EmployeeID = e2.EmployeeID
where   nvl(e1.EmployeeName,'-') <> nvl(e2.EmployeeName,'-')

where条款表示EmployeeName列中必定有更改。 nvl调用是必需的,因为当找不到匹配项时,外部联接会返回null,并且与null的比较永远不会成功。

答案 1 :(得分:1)

您需要执行FULL OUTER JOIN

SELECT t1.employeeid AS employeeid1, t1.employeename AS employeename1
     , t2.employeeid AS employeeid2, t2.employeename AS employeename2
  FROM table1 t1 FULL OUTER JOIN table2 t2
    ON t1.employeeid = t2.employeeid
 WHERE t1.employeename IS NULL
    OR t2.employeename IS NULL
    OR t1.employeename != t2.employeename;

Please see SQL Fiddle demo here.