Mengenoperationen

SQL stellt eine Reihe von Mengenoperationen zur Verfügung, die für die tägliche Arbeit mit dem System von entscheidender Bedeutung sind. Wollen wir beispielsweise die Ergebnisse von mehreren SQL-Statements in einem Ergebnis vereinen, können wir das Schlüsselwort UNION verwenden:

test=# SELECT name, price 
		FROM t_produkt 
	UNION SELECT 'Summe: ' AS name, SUM(price) 
	FROM t_produkt 
	ORDER BY price;
     name     | price
--------------+--------
 Apfel        |   0.45
 Semmel       |      1
 Käsestangerl |      2
 Rose         |   2.16
 Kasten       |    216
 Summe:       | 221.61
(6 rows)

In diesem Fall haben wir die Liste der Produkte und deren Gesamtpreis ausgegeben. Um den Datenbestand nach dem Preis zu sortieren, müssen wir ans Ende der Query eine ORDER BY Clause einfügen.

Wichtig ist, dass Sie das ORDER BY am Ende des Statements einfügen, da es für den gesamten Datenbestand gilt:

test=# SELECT name, price 
		FROM t_produkt 
		ORDER BY name 
	UNION SELECT 'Summe: ' AS name, SUM(price) 
	FROM t_produkt;
ERROR:  syntax error at or near "SELECT" at character 55
LINE 1: ...CT name, price FROM t_produkt ORDER BY name UNION SELECT 'Su...

Oft ist es notwendig, die einzelnen Teile des Ergebnisses in unterschiedlicher Reihenfolge auszugeben. In solchen Fällen müssen Sie einen Teil der Query in ein Subselect verpacken, um die entsprechende Sortierreihenfolge zu erreichen. Das nächste Beispiel zeigt, wie Sie die Produkte absteigend sortieren können. Am Ende des Listings soll die Summe aufscheinen:

test=# SELECT * 
	FROM (SELECT name, price 
		FROM t_produkt 
		ORDER BY name DESC) AS x 
	UNION SELECT 'Summe: ' AS name, SUM(price) 
		FROM t_produkt;
     name     | price
--------------+--------
 Apfel        |   0.45
 Kasten       |    216
 Käsestangerl |      2
 Rose         |   2.16
 Semmel       |      1
 Summe:       | 221.61
(6 rows)

Neben UNION definiert SQL noch weitere Schlüsselwörter: INTERSECT bildet die Schnittmenge zwischen zwei Datenbeständen. In der Praxis sieht das dann so aus:

test=# SELECT * 
		FROM t_produkt_gruppe 
		WHERE produkt_id IN (1, 2, 3) 
	INTERSECT
	SELECT * 
		FROM t_produkt_gruppe 
		WHERE produkt_id IN (1, 2);
 produkt_id |    gruppe
------------+--------------
          1 | Lebensmittel
          2 | Lebensmittel
(2 rows)

Wir erhalten nur die Gruppen 1 und 2.

Wollen Sie das Ergebnis von zwei SQL-Statements voneinander abziehen, können Sie auf EXCEPT zurückgreifen:

test=# SELECT * 
		FROM t_produkt_gruppe 
		WHERE produkt_id IN (1, 2, 3) 
	EXCEPT
	SELECT * 
		FROM t_produkt_gruppe 
		WHERE produkt_id IN (1, 2);
 produkt_id | gruppe
------------+--------
          3 | Möbel
(1 row)

Es bleibt in diesem Fall nur die Produktgruppe 3 übrig.


Cybertec Schönig & Schönig GmbH
PostgreSQL support, training, consulting
www.postgresql-support.de