2009-12-11 16 views
10

J'essaie d'obtenir toutes les valeurs distinctes sur deux tables en utilisant une union.Obtention d'une valeur distincte sur deux tables de serveurs SQL Server

L'idée est d'obtenir un compte de toutes les valeurs uniques dans la colonne columnA sans répétitions afin que je puisse obtenir une somme de toutes les colonnes qui contiennent un unique columnA.

C'est ce que j'ai essayé (serveur SQL Express 2008)

select 
    count(Distinct ColumnA) 
from 
( 
    select Distinct ColumnA as ColumnA from tableX where x = y 
    union 
    select Distinct ColumnA as ColumnA from tableY where y=z 
) 
+2

Et ce qui ne fonctionne pas exactement? Vous avez des DISTINCTs superflus mais sinon cela devrait fonctionner. –

+0

Qu'est-ce que vous obtenez jusqu'à présent qui vous amène à croire que ce que vous avez est incorrect? –

Répondre

17
SELECT COUNT(distinct tmp.ColumnA) FROM ((SELECT ColumnA FROM TableX WHERE x=y) 
UNION (SELECT ColumnA FROM TableY WHERE y=z)) as tmp 

Les TableX supplémentaires sur concepts distincts et TABLEY ne sont pas nécessaires; ils seront supprimés dans la clause tmp.ColumnA. La déclaration d'une table temporaire devrait éliminer l'ambiguïté qui aurait pu empêcher l'exécution de votre requête.

+8

DISTINCT dans COUNT (DISTINCT n'est pas nécessaire car 'UNION' supprime les doublons –

+0

Cela a fonctionné pour moi.J'ai simplement dû ajouter comme ColumnA à la fin de l'instruction select union'd – rockit

+0

@OMG: Bon appel. l'aide –

10
SELECT COUNT(*) 
FROM 
(
SELECT DISTINCT ColumnA From TableX WHERE x = y 
UNION 
SELECT DISTINCT ColumnA From TableY WHERE y = z 
) t 

L'utilisation d'un "UNION" ne retournera pas les doublons. Si vous avez utilisé "UNION ALL", les valeurs ColumnA dupliquées de chaque table DEVRAIENT être renvoyées.

+2

DISTINCT n'est pas nécessaire en raison de l'UNION, qui supprime les doublons. «UNION ALL» ne ** pas ** supprimer les doublons –

+0

True - Je pensais juste y compris le distinct dans il pourrait y avoir plus performant (le plan d'exécution est différent) - cela demanderait un peu plus de tests pour prouver/réfuter cela Re: UNION ALL, c'est ce que j'ai dit :) – AdaTheDev

0

Pour obtenir des valeurs distinctes dans l'Union requête, vous pouvez essayer cette

Select distinct AUnion.Name,AUnion.Company from (SELECT Name,Company from table1 UNION SELECT Name,Company from table2)AUnion 
1
SELECT DISTINCT Id, Name 
FROM TableA 
UNION ALL 
SELECT DISTINCT Id, Name 
FROM TableB 
WHERE TableB.Id NOT IN (SELECT Id FROM TableA) 
+0

Pleas ajoute des commentaires à votre code – Observer