2010-07-01 2 views
5

У меня есть 2 таблицы:
T1(IDa,IDb): есть данные, как этотКак сделать это SQL заявление

 
    IDa IDb 
    1 2 
    3 4 
    5 6 
    7 8 

и T2(IDc,IDd): с данными, как этот

 
    IDc IDd 
    1 2 
    4 5 
    3 6 
    7 8 

и тождественность для каждой таблицы пара идентификаторов:

  • T1, идентификатор IDa и IDb
  • Т2 МЦД и IDD

Вопрос заключается в том: Как извлечь «Не совпавшие» записи из двух таблиц ??? В этом случае

  • согласованный являются 1,2 и 7,8
  • "не соответствует" являются: 3,4 $ 5,6 $ 4,5 $ 3,6

Я могу сделать это, используя строки и конкатенации. У кого-нибудь есть метод, использующий внутреннее соединение или любой другой метод?

ответ

3
select IDa, IDb from T1 
where not exists (select 1 from T2 where T2.IDc = T1.IDa and T2.IDd = T1.IDb) 
union all 
select IDc, IDd from T2 
where not exists (select 1 from T1 where T2.IDc = T1.IDa and T2.IDd = T1.IDb) 

?

+0

хорошие спасибо, – RMohammed

5
DECLARE @Result nvarchar(max) 


SELECT @Result = ISNULL(@Result + '$','') + 
     CAST(ISNULL(IDa,IDc) AS VARCHAR(5)) + ',' + 
      CAST(ISNULL(IDb,IDd) AS VARCHAR(5)) 
FROM T1 FULL OUTER JOIN T2 
ON T1.IDa = T2.IDc AND T1.IDb = T2.IDd 
WHERE T1.IDa IS NULL OR T2.IDc IS NULL 

Редактировать Конечно, если $ и , не требуется использовать только

SELECT ISNULL(IDa,IDc), ISNULL(IDb,IDd) 
FROM T1 FULL OUTER JOIN T2 
ON T1.IDa = T2.IDc AND T1.IDb = T2.IDd 
WHERE T1.IDa IS NULL OR T2.IDc IS NULL 

так или иначе, только для пинков (MS SQL Server 2005+)

SELECT IDa, IDb from T1 
EXCEPT 
SELECT IDc, IDd from T2 
UNION ALL 
(
SELECT IDc, IDd from T2 
EXCEPT 
SELECT IDa, IDb from T1 
) 
+0

Да, полное внешнее соединение - это название вашей игры – Thomas

+0

да, это помогает мне, спасибо – RMohammed

Смежные вопросы