2016-10-05 2 views
1

Я ищу способ найти непревзойденные записи из нескольких полей и вернуть результат для сравнения.SQL find unmatched of multiple fields

Например

Т1

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

Т2

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 

5-я запись не показана, поскольку она является точно одна и та же. Остальные показаны, так как существуют некоторые различия в одном из полей.

Есть ли способ сделать это MS-SQL

Благодаря

+0

Какие «некоторые различия» к вам? Насколько они могут быть и по каким алгоритмам? – trincot

+0

Как, например, разница между первой строкой в ​​T1 и T2 является идентификатором. Во второй строке имя. В третьем ряду фамилия. В 4-й строке - статус. – 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