2008-05-03

UNION und UNION ALL

UNION Statement unterdrückt wie bei einem SELECT DISTINCT die doppelten Einträge im Resultat. Von den mehrfach vorkommenden Datensätzen wird nur ein Datensatz im Resultat zurückgegeben.

Für die Verwendung von UNION und UNION ALL Statements werden mindestens zwei Datenquellen benötigt. Die beiden Datenquellen müssen gleicher Anzahl Spalten (Columns) besitzen. Jeder einzelnen Spalte in der Tabelle 1 muss in der Tabelle 2 mit gleichem Datentyp (data type) vorkommen.

Für die Verwendung von UNION und UNION ALL Statements werden mindestens zwei Datenquellen benötigt. Die ausgewählten Spalten (Columns) der beiden Datenquellen müssen in gleicher Anzahl vorkommen. Auch die Datentypen (data types) dieser Spalten müssen vom selben Typ sein.

Im Resultat werden als Spaltennamen die Spaltennamen der ersten Datenquelle verwendet.

UNION ALL Statement liefert alle Datensätze aus beiden Datenquellen als Resultat zurück. Hier werden die doppelten Einträge nicht unterdrückt und sie werden als ein des Resultates zurückgegeben. Für die Verwendung von UNION ALL Statement gelten die gleichen Bedingungen für die Datenquellen wie beim UNION-Statement.

Für das Beispiel werden zwei Tabellen mit dem Namen CountryCity und CountryCapital erstellt.

1
2 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CountryCity]') AND type in (N'U'))
3 DROP TABLE [dbo].[CountryCity]
4 GO
5
6 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CountryCapital]') AND type in (N'U'))
7 DROP TABLE [dbo].[CountryCapital]
8 GO
9
10 CREATE TABLE [dbo].[CountryCity]([ID] [int] NOT NULL,
11 [Country] [nvarchar] (50) NOT NULL,
12 [City] [nvarchar] (50) NOT NULL)
13
14 CREATE TABLE [dbo].[CountryCapital]([ID] [int] NOT NULL,
15 [Country] [nvarchar] (50) NOT NULL,
16 [City] [nvarchar] (50) NOT NULL)
17
18




In der Tabelle CountryCity befinden die Länder und Städte.



1 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (1, 'SWITZERLAND', 'ZURICH')
2 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (2, 'SWITZERLAND', 'BERN')
3 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (3, 'SWITZERLAND', 'GENEVA')
4 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (4, 'GERMANY', 'BERLIN')
5 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (5, 'GERMANY', 'HAMBURG')
6 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (6, 'GERMANY', 'MUNICH')
7 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (7, 'AUSTRIA', 'VIENNA')
8 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (8, 'AUSTRIA', 'GRAZ')
9 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (9, 'AUSTRIA', 'LINZ')
10 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (10, 'TURKIYE', 'ISTANBUL')
11 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (11, 'TURKIYE', 'ANKARA')
12 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (12, 'TURKIYE', 'IZMIR')


Die Tabelle CountryCapital beinhaltet die Länder und die Hauptstadt des Landes.





1 INSERT INTO [dbo].[CountryCapital] ([ID], [Country], [City]) VALUES (1, 'SWITZERLAND', 'BERN')
2 INSERT INTO [dbo].[CountryCapital] ([ID], [Country], [City]) VALUES (2, 'GERMANY', 'BERLIN')
3 INSERT INTO [dbo].[CountryCapital] ([ID], [Country], [City]) VALUES (3, 'AUSTRIA', 'VIENNA')
4 INSERT INTO [dbo].[CountryCapital] ([ID], [Country], [City]) VALUES (4, 'TURKIYE', 'ANKARA')




Die Verwendung von UNION Statement liefert aus den beiden Tabellen jeder Stadt nur einmal im als Resultat zurück. In diesem Resultat sind die Datensätze auch nach dem Ersten und dann nach dem zweiten Feld sortiert, welches nach einem ORDER BY Country, City entspricht. Für eine andere Sortierung muss der ORDER BY-Statement explizit angegeben werden.



1 SELECT Country, City
2 FROM [dbo].[CountryCity]
3 UNION
4 SELECT Country, City
5 FROM [dbo].[CountryCapital]


Als Resultat wird folgendes ausgegeben:



UNION



Mit UNION ALL werden alle Datensätze der beiden Tabellen als Resultat zurückgeliefert. Die Datensätze sind in diesem Resultat nicht sortiert.



1 SELECT Country, City
2 FROM [dbo].[CountryCity]
3 UNION ALL
4 SELECT Country, City
5 FROM [dbo].[CountryCapital]


Als Resultat wird folgendes ausgegeben:



UNION_ALL



Der gesamte Beispiel Code ist wie folgt aufgelistet:



1 BEGIN TRANSACTION
2
3 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CountryCity]') AND type in (N'U'))
4 DROP TABLE [dbo].[CountryCity]
5 GO
6
7 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CountryCapital]') AND type in (N'U'))
8 DROP TABLE [dbo].[CountryCapital]
9 GO
10
11 CREATE TABLE [dbo].[CountryCity]([ID] [int] NOT NULL,
12 [Country] [nvarchar] (50) NOT NULL,
13 [City] [nvarchar] (50) NOT NULL)
14
15 CREATE TABLE [dbo].[CountryCapital]([ID] [int] NOT NULL,
16 [Country] [nvarchar] (50) NOT NULL,
17 [City] [nvarchar] (50) NOT NULL)
18
19
20 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (1, 'SWITZERLAND', 'ZURICH')
21 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (2, 'SWITZERLAND', 'BERN')
22 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (3, 'SWITZERLAND', 'GENEVA')
23 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (4, 'GERMANY', 'BERLIN')
24 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (5, 'GERMANY', 'HAMBURG')
25 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (6, 'GERMANY', 'MUNICH')
26 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (7, 'AUSTRIA', 'VIENNA')
27 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (8, 'AUSTRIA', 'GRAZ')
28 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (9, 'AUSTRIA', 'LINZ')
29 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (10, 'TURKIYE', 'ISTANBUL')
30 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (11, 'TURKIYE', 'ANKARA')
31 INSERT INTO [dbo].[CountryCity] ([ID], [Country], [City]) VALUES (12, 'TURKIYE', 'IZMIR')
32
33 INSERT INTO [dbo].[CountryCapital] ([ID], [Country], [City]) VALUES (1, 'SWITZERLAND', 'BERN')
34 INSERT INTO [dbo].[CountryCapital] ([ID], [Country], [City]) VALUES (2, 'GERMANY', 'BERLIN')
35 INSERT INTO [dbo].[CountryCapital] ([ID], [Country], [City]) VALUES (3, 'AUSTRIA', 'VIENNA')
36 INSERT INTO [dbo].[CountryCapital] ([ID], [Country], [City]) VALUES (4, 'TURKIYE', 'ANKARA')
37
38 SELECT Country, City
39 FROM [dbo].[CountryCity]
40 UNION
41 SELECT Country, City
42 FROM [dbo].[CountryCapital]
43
44
45 SELECT Country, City
46 FROM [dbo].[CountryCity]
47 UNION ALL
48 SELECT Country, City
49 FROM [dbo].[CountryCapital]
50
51 ROLLBACK TRANSACTION


Die Beispieldatei findet Ihr unter: UNION_and_UNION_ALL_Sample_0001.sql

No comments: