Найти совпадающие записи столбцов в одной таблице, которые могут быть в нескольких столбцах второй таблицы - PullRequest
1 голос
/ 16 марта 2020

У меня есть две таблицы, Таблица 1 с несколькими столбцами, имя, идентификационный номер, адрес и т. Д. c. И Таблица 2 со столбцами, идентификационный номер 1 и идентификационный номер 2 и несколько других столбцов.

Я пытаюсь получить запрос T- SQL, возвращающий все строки в таблице 1 с индикатором, показывающим, соответствует ли номер идентификатора в таблице 1 ID_1 или ID_2 в таблице 2. Результирующий набор будет столбцы из Таблицы 1, плюс индикатор «Совпадение», если идентификационный номер в Таблице 1 соответствует либо ID_1, либо ID_2 в Таблице 2.

  • Таблица 1: ID | Имя | Адрес |
  • Таблица 2: ID_1 | ID_2

Результат

T1.ID, Name, Address, ("Matched"/"Unmatched") ...

Кроме того, было бы то же самое, чтобы сделать обратное, то есть вместо результата, включая все строки из таблицы 1, которые имеют совпадающий идентификатор в ID_1 или ID_2 в таблице 2, набор результатов будет включать только записи из таблицы 1, где t1.ID = (T2.ID_1 или T2.ID_2)?

 SELECT DISTINCT  
     CASE 
        WHEN (table1.ID = table2.ID_1 ) 
           THEN 'Matched'  
           ELSE 'Unmatched'  
     END AS Status ,
     table1.*
 FROM
     table1  
 LEFT JOIN 
     table2 ON table1.ID = table2.ID_1 

 UNION

 SELECT DISTINCT  
     CASE 
        WHEN (table1.ID = table2.ID_2)  
           THEN 'Matched'  
           ELSE 'Unmatched'  
     END AS Status,  
     table1.*
 FROM     
     table1  
 LEFT JOIN 
     table2 ON table1.ID = table2.ID_2

1 Ответ

1 голос
/ 16 марта 2020

Я думаю, что коррелированный подзапрос с условием exists был бы разумным решением:

select
    t1.*,
    case when exists (select 1 from table2 t2 where t1.id in (t2.id_1, t2.id_2))
        then 'Matched'
        else 'Unmatched'
    end matched
from table1 t1

И наоборот:

select
    t2.*,
    case when exists (select 1 from table1 t1 where t1.id in (t2.id_1, t2.id_2))
        then 'Matched'
        else 'Unmatched'
    end matched
from table2 t2

Если вы хотите " выровняйте строки по совпадению для всего набора данных одновременно, тогда вы можете попробовать full join:

select t1.*, t2.*
from table1 t1
full join table2 t2 on t1.id in (t2.id_1, t2.id_2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...