2009-12-11 6 views
10

Ich versuche, alle eindeutigen Werte über 2 Tabellen mit einer Union zu erhalten.Einen eindeutigen Wert über 2 Union-SQL-Server-Tabellen erhalten

Die Idee ist, eine Zählung aller eindeutigen Werte in der SpalteA Spalte ohne Wiederholungen zu erhalten, so dass ich eine Summierung aller Spalten erhalten kann, die eine eindeutige SpalteA enthalten.

Das ist, was ich versucht (SQL Server 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

versuchen können und was nicht funktioniert das genau? Sie haben einige überflüssige DISTINCTs, aber ansonsten sollte das funktionieren. –

+0

Was kommst du so weit, dass du glaubst, was du hast, ist falsch? –

Antwort

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

die extra distincts auf TableX und Tabley sind nicht erforderlich; Sie werden in der tmp.ColumnA-Klausel entfernt. Das Deklarieren einer temporären Tabelle sollte die Mehrdeutigkeit beseitigen, die die Ausführung Ihrer Abfrage möglicherweise verhindert hat.

+8

Die DISTINCT in der COUNT (DISTINCT ist nicht notwendig, weil 'UNION' entfernt Duplikate –

+0

THes funktionierte für mich. Ich musste einfach als ColumnA am Ende der Union'd Select-Anweisung hinzufügen – rockit

+0

@OMG: Guter Anruf. Danke für die Hilfe. –

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

Die Verwendung einer "UNION" gibt keine Duplikate zurück. Wenn Sie "UNION ALL" verwenden, werden doppelte ColumnA-Werte aus jeder Tabelle zurückgegeben.

+2

DISTINCT ist nicht notwendig wegen der UNION, die Duplikate entfernt. "UNION ALL" tut ** nicht ** entfernt Duplikate –

+0

Wahr - ich dachte nur, dass das distinct drin sein könnte leistungsfähiger (Ausführungsplan ist anders) - würde ein bisschen mehr Tests erfordern, um das zu beweisen/widerlegen. Re: UNION ALL, das ist, was ich sagte :) – AdaTheDev

0

Um unterschiedliche Werte in Union Abfrage erhalten Sie diese

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

Bitte fügen Sie einige Kommentare zu Ihrem Code – Observer