2016-10-05 24 views
1

我正在尋找一種方法來查找來自多個字段的不匹配記錄並返回結果進行比較。SQL找不到多個字段

例如

T1

ID Name Surname Status 
1  Jane Ryan  Single 
2  William Smith  Single 
3  Sam  Trim  Married 
4  Lea  Sun  Married 
5  Angel Byre  Married 

T2

ID Name Surname Status 
6  Jane Ryan  Single 
2  Will Smith  Single 
3  Sam  Trimy  Married 
4  Lea  Sun  Single 
5  Angel Byre  Married 

我想顯示類似:

T1.ID T1.Name T1.Surname T1.Status T2.ID T2.Name T2.Surname T2.Status 
1  Jane Ryan  Single 6  Jane Ryan  Single 
2  William Smith  Single 2  Will Smith  Single 
3  Sam  Trim  Married 3  Sam  Trimy  Married 
4  Lea  Sun  Married 4  Lea  Sun  Single 

的第五記錄中未示出,因爲它是確切地說相同。顯示其他人是有一些差異的領域之一。

有沒有辦法做,這是MS-SQL

感謝

+0

什麼是「一定的差異」給你?他們有多不同,根據哪種算法? – trincot

+0

例如,T1和T2中第一行的區別就是ID。在第二行的名稱。在第三行的姓氏。在第四行的狀態。 – Selrac

+0

好吧,所以你正在尋找3個相同的領域,而另一個可以完全不同? – trincot

回答

3

您可以使用連接使用的所有字段,怎麼算其中許多匹配,只保留四個字段中正好三個匹配的記錄:

select  t1.*, 
      t2.* 
from  t1 
inner join t2 
     on (case when t1.name = t2.name then 1 else 0 end) 
     + (case when t1.surname = t2.surname then 1 else 0 end) 
     + (case when t1.id  = t2.id  then 1 else 0 end) 
     + (case when t1.status = t2.status then 1 else 0 end) = 3 

此查詢可能無法從索引中受益,因此您應該驗證它在數據上的表現。

+0

Trincot,這是很漂亮的編碼。驚人!! – Selrac

+0

很高興喜歡它。 ;-) – trincot

0

可以使用join做到這一點:

select t1.*, t2.* 
from t1 join 
    t2 
    on (t1.name = t2.name and t1.surname = t2.surname) or 
     t1.id = t2.id 
where t1.id <> t2.id or t1.status <> t2.status or 
     t1.name <> t2.name or t1.surname <> t2.name; 
0

使用列別名與同義詞

SELECT T1.ID AS [T1.ID] 
    ,T1.NAME AS [T1.Name] 
    ,T1.Surname AS [T1.Surname] 
    ,T1.STATUS AS [T1.Status] 
    ,T2.ID AS [T2.ID] 
    ,T2.NAME AS [T2.Name] 
    ,T2.Surname AS [T2.Surname] 
    ,T2.STATUS AS [T2.Status] 
FROM T1 
INNER JOIN T2 ON T1.NAME = T2.NAME 
    AND T1.Surname = T2.Surname 
    AND T1.ID <> T2.ID 
    AND T1.STATUS <> T2.STATUS