Как сделать это заявление SQL - PullRequest
5 голосов
/ 01 июля 2010

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

    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
  • T2 - это IDc и IDd

Вопрос в том, как извлечь «несопоставленные» записи из двух таблиц ??? В этом случае

  • соответствуют 1,2 и 7,8
  • "несоответствие": 3,4 $ 5,6 $ 4,5 $ 3,6

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

Ответы [ 2 ]

5 голосов
/ 01 июля 2010
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
)
3 голосов
/ 01 июля 2010
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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...