2009-12-11 10 views
10

Sto provando a ottenere tutti i valori distinti su 2 tabelle utilizzando un unione.Ottenere un valore distinto su 2 tabelle union sql server

L'idea è di ottenere un conteggio di tutti i valori univoci nella colonna colonna senza ripetizioni in modo che sia possibile ottenere una somma di tutte le colonne che contengono una colonna unica A.

Questo è quello che ho provato (server 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

E quello che non funziona esattamente? Hai alcuni DISTINTUTI superflui, ma altrimenti dovrebbe funzionare. –

+0

Cosa stai ottenendo finora che ti porta a credere che quello che hai non è corretto? –

risposta

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

I distinti extra sulla TableX e Tabley non sono necessari; verranno eliminati nella clausola tmp.ColumnA. La dichiarazione di una tabella temporanea dovrebbe eliminare l'ambiguità che potrebbe aver impedito l'esecuzione della query.

+8

Il DISTINCT nel COUNT (DISTINCT non è necessario perché 'UNION' rimuove i duplicati –

+0

Questo ha funzionato per me.Io dovevo semplicemente aggiungere come ColonnaA alla fine della dichiarazione di selezione dell'unione – rockit

+0

@OMG: Buona chiamata. Grazie per l'assistenza –

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

L'utilizzo di un "UNION" non restituisce i duplicati. Se si è utilizzato "UNION ALL", quindi duplicare i valori ColumnA di ogni tabella, si supporterà di restituire.

+2

DISTINCT non è necessario a causa dell'UNION, che rimuove i duplicati. 'UNION ALL' fa ** not ** rimuove i duplicati –

+0

Vero - ho solo pensato di includere il distinto potrebbe esserci più performante (il piano di esecuzione è diverso) - richiederebbe un po 'più di test per dimostrare/confutare quello. Re: UNION ALL, questo è quello che ho detto :) – AdaTheDev

0

Per ottenere valori distinti in query di unione si può provare questo

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 aggiungere alcuni commenti al tuo codice – Observer