Ab und zu besteht die Herausforderung im SQL Server Daten aus mehreren Abfragen in einem Ergebnis darzustellen. Hier behilflich ist uns der Union-Operator.
Wenn Sie nun Ihre Kunden, aus Performance-Gründen, in mehrere Tabellen aufgeteilt haben und nun eine Abfrage über alle Kunden benötigen, hilft Ihnen hier das UNION. Wichtig ist hier das die Anzahl der Spalten des Select-Statements gleich sind, ebenso das die Datentypen der Spalten miteinander vergleichbar sind.
Das Union würde nun alle Datensätze der zwei Tabellen ausgeben, allerdings OHNE Duplikate.
Ergo: Die zwei roten Teile und EINMAL der grüne Bereich.
Select Shipcountry from Orders
Union
Select Country from Customers
Wer die Duplikate mitnehmen will, ersetzt das UNION durch UNION ALL und volià.
Bei diesem Syntax gibt es allerdings einige Sachen zu beachten. Wenn man zum Beispiel einen Alias auf die Ausgabespalte setzen will, muss der Alias in der ersten Select-Anweisung gesetzt werden.
Select Shipcountry as Land from Orders
union
Select Country from Customers
Mit diesem Statement würde die Ausgabespalte wie folgt aussehen.
Ein weiterer Fallstrick ist das ORDER BY, welches nur ganz unten im Statement auftreten darf.
Select Shipcountry from Orders
union
Select Country from Customers
Order by ShipCountry
Falls Sie nun die zusammengefasste Menge in eine Tabellen wegschreiben wollen würde der Syntax so aussehen:
Select Shipcountry into DemoTab from Orders
union
Select Country from Customers
Neben UNION und UNION ALL gibt es noch zwei weitere Operatoren die auf diesem Prinzip basieren und eine sehr tolle Funktionalität bieten.
INTERSECT & EXCEPT
Beim INTERSECT werden alle Datensätze angezeigt die in allen beteiligten Tabellen gleich sind, die Schnittmenge.
Mit INTERSECT wäre die Ergebnismenge der rot eingefärbte Bereich, allerdings wird zusätzlich noch ein DISTINCT angewendet, was heißt das jeder Datensatz nur einfach vorkommt.
Mit EXCEPT lassen sich Datensätze zurückliefern die in der ersten Tabelle vorhanden sind und in der zweiten Tabelle fehlen. Wichtig ist hier die Reihenfolge der Select-Statements, denn es werden die Datensätze der Tabelle angezeigt die im ersten Select stehen!
Hier wäre wieder die roteingefärbte Menge das Ergebnis.
Die verschiedenen Operatoren können auch in Kombination verwendet werden, doch könnte es sein das Sie womöglich Klammern einsetzen müssen um zum richtigen Ergebnis zu kommen.
Falls es unter Ihnen jemanden geben sollte der solche Herausforderungen ohne EXCEPT oder INTERSECT löst, würde ich diesen jemand bitte dazu bewegen es sich nochmal zu überlegen.
Hier ein paar Beispiele im Vergleich.
-- Except
Select Shipcountry from Orders
Except
Select Country from customers
-- Exists
Select distinct Shipcountry
from orders o
where not exists (Select 1 from customers c
where c.Country = o.ShipCountry)
-- Left Join
Select distinct shipcountry
from orders o
left join customers c
on c.Country = o.ShipCountry
where C.Country is null
Und nun die dazugehörigen Ausführungspläne:
Die Ausführungspläne sprechen für sich. Die Variante mit Except ist laut Ausführungsplan die günstigste. Mit Intersect sieht es nicht anders aus.
Viel Spaß damit