2010-07-01 7 views
5

J'ai 2 tables:
T1(IDa,IDb): a données comme celui-ciComment faire cette déclaration sql

 
    IDa IDb 
    1 2 
    3 4 
    5 6 
    7 8 

et T2(IDc,IDd): avec des données comme celui-ci

 
    IDc IDd 
    1 2 
    4 5 
    3 6 
    7 8 

et l'identité de chaque table est la paire d'ID:

  • T1, l'identité est IDa et IDb
  • T2 est IDc et IDd

La question est la suivante: Comment récupérer les enregistrements "ne correspond pas" des deux tables ??? Dans ce cas,

  • la correspondance sont 1,2 et 7,8
  • le "non appariées" sont les suivants: 5,6 $ 4,5 3,4 $ 3,6 $

Je peux le faire en utilisant des chaînes et la concaténation. Est-ce que quelqu'un avait une méthode utilisant la jointure interne ou toute autre méthode?

Répondre

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

bon effort, merci – 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 

Modifier Bien sûr, si la $ et , n'est pas nécessaire il suffit d'utiliser

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 

Ou une autre façon, juste pour le plaisir (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

Oui, la jointure externe complète est le nom de votre jeu – Thomas

+0

oui, ça m'aide, merci – RMohammed