2009-07-08 8 views
3

Je veux fusionner le résultat de deux sous-requêtes (par exemple SUB1 et SUB2). Les sous-requêtes ont plusieurs colonnes, y compris une colonne ID.Combinaison SQL Union et Except

Si un ID = 1 existe dans SUB1, je souhaite que le résultat de regroupement inclue uniquement la ligne ID = 1 de SUB1 et n'inclue pas la ligne ID = 1 de SUB2.

par ex. si SUB1 avait les colonnes et les lignes suivantes

ID | Date 
1 | 7/1 
2 | 7/3 

Et SUB2 avait les éléments suivants:

ID | Date 
1 | 7/4 
3 | 7/8 

Je voudrais le résultat de l'union d'être

ID | Date 
1 | 7/1 
2 | 7/3 
3 | 7/8 

La seule façon que je peux penser est de faire quelque chose comme

SELECT * FROM (SUB1) 

UNION 

SELECT * FROM (SUB2) 
WHERE ID NOT IN 
(SELECT ID FROM (SUB1)) 

Ma seule préoccupation est que SUB1 et SUB2 sont de longues requêtes. Je voudrais éviter de coller SUB1 deux fois dans ma requête.

Y a-t-il un moyen plus concis? Merci

Répondre

4
SELECT COALESCE(sub1.id, sub2.id), COALESCE(sub1.date, sub2.date) 
FROM sub1 
FULL OUTER JOIN 
     sub2 
ON  sub1.id = sub2.id 
+0

merci, cela fonctionne. – David

0

vous pouvez regrouper par ID.

SELECT ID, MAX(Date) FROM (SUB1) 
UNION 
SELECT ID, MAX(Date) FROM (SUB2) 
GROUP BY ID 
4

Si vous utilisez SQL Server 2005 ou plus, une expression de table commune aidera à ne pas taper le code deux fois:

; with CTE_Sub1 as (select * from (Sub1)) 
select * from CTE_Sub1 
union 
select * from (sub2) 
where ID not in (select id from CTE_Sub1) 
+0

Le serveur avec lequel je travaille est SQL Server 2000, mais c'est une bonne chose à savoir aussi. Merci de votre aide. – David

0

Qu'en est-il un FULL OUTER JOIN et un ISNULL?

SELECT 
    ISNULL(SUB1.ID, SUB2.ID), 
    ISNULL(SUB1.[Date], SUB2.[Date]) 
FROM 
    SUB1 
FULL OUTER JOIN 
    SUB2 
ON 
    SUB1.ID = SUB2.ID