我有两个具有相同列的相同数据的表。其中一个表中的数据可能会更新,我需要显示数据比较。结果数据集应仅包含新行,已删除或已修改的行。 请考虑以下数据。
表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个或更多列的复合密钥。以所需格式实现这种比较的最佳方法是什么?
答案 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;