2011-04-24 128 views
0

在兩個表中具有相同主鍵的兩個不同表中比較數據值的最佳方法是什麼?比較SQL中具有不同字段名稱的兩個表

任何人都可以提出最好的方法嗎?

+1

請更具體一些。你想要比較多少列?提供表格模式也有幫助。 – harpo 2011-04-24 05:49:34

+1

比較以什麼方式?你想達到什麼目的? – Oded 2011-04-24 05:50:54

+0

這兩個表的數據類型是否相同? – 2011-04-24 05:51:24

回答

3

如果要比較數據值,則有兩個級別;

  1. 您可以在一個表中存在不存在於另一個表中的行。在這裏,您需要在一邊對每個表執行兩個左連接查詢。

  2. 對於相同的記錄,您需要逐個比較字段。不幸的是,很容易。另一種方法是在整行上執行校驗和。

您還可以購買sql redgate比較和數據比較,比較結構和數據。你可以試用它的試用軟件 - 它真棒。

http://www.red-gate.com/products/sql-development/sql-compare/

http://www.red-gate.com/products/sql-development/sql-data-compare/

1

通常的辦法比較兩個表是full outer join,如:

select coalesce(t1.pk, t2.pk) as Key 
,  case 
     when t1.pk is null then 'Not found in Table1' 
     when t2.pk is null then 'Not found in Table2' 
     else 'Different' 
     end as Reason 
from Table1 as t1 
full outer join 
     Table2 as t2 
on  t1.pk = t2.pk 
where t1.pl is null 
     or t2.pk1 is null 
     or t1.col1 <> t2.col1 
     or t1.col2 <> t2.col2 
     or t1.col3 <> t2.col3 
     ... 

空列需要額外的邏輯。假設沒有行包含值<<NULL>>,你可以:

 or IsNull(t1.col4,'<<NULL>>') <> IsNull(t2.col4,'<<NULL>>') 
0

與BINARY_CHECKSUM功能,像這樣嘗試:

declare @Table1 table (Id int identity(1,1), Param1 varchar(10), Param2 int) 
declare @Table2 table (Id int identity(1,1), Param1 varchar(10), Param2 int) 

insert into @Table1 (Param1, Param2) select 'A', 1 
insert into @Table2 (Param1, Param2) select 'A', 1 

select t1.*, t2.* 
from @Table1 t1 full join @Table2 t2 on (t1.Id = t2.Id) 
where binary_checksum(t1.Id, t1.Param1, t1.Param2) <> binary_checksum(t2.Id, t2.Param1, t2.Param2) 

查詢返回的記錄,那只是一個表中,而不是在另一。該查詢還返回兩個表(使用主鍵)中的記錄,但其他列是不同的。

編輯 - 你是什麼意思與不同的字段名稱?如果兩個表格都有不同的字段,那麼它們的偏差就會不同...

相關問題