====== Set Operatoren ======
Mit Set Operatoren kann man die Rückgabemenge von zwei Queries gegeneinander abgleichen.
Teilmenge 1 Schnittmenge
|------------------|-------------|
Menge 1 |------------------+-------------| (Teilmenge 2)
| Menge 2 |-------------+------------------|
|------------------+-------------+------------------|
Gesamtmenge
Die Gesamtmenge ermittelt man mit ''UNION'' (ohne Duplikate) und ''UNION ALL'' (mit Duplikate).\\
Die Schnittmenge wird mit ''INTERSECT'' ermittelt.\\
Die Teilmenge 1 ermittelt man über ''EXCEPT'' (ISO-SQL) bzw. ''MINUS'' (Oracle-spezifische Schreibweise).
===== Einige Beispiele für Set Operatoren =====
==== UNION (ALL) ====
/*
Erstelle einen Report nach folgenden Spezifikationen:
- Nachnamen und Department-ID aller Mitarbeiter der EMPLOYEE Tabelle unabhängig davon, ob oder welchem Department sie angehören.
- Department-ID und Department-Namen aller Departments der DEPARTMENTS Tabelle unabhängig, ob oder welche Mitarbeiter dort arbeiten.
Schreibe einen Query, der beides in einen Report zusammenführt.
*/
SELECT last_name,department_id,TO_CHAR(null)dept_name
FROM employees
UNION
SELECT TO_CHAR(null),department_id,department_name
FROM departments;
==== INTERSECT ====
/*
Erstelle eine Liste von Mitarbeiternummern aller Vertriebsmitarbeiter (job_id=SA_REP), die auch im Vertriebs-Department (department_name=Sales) arbeiten.
*/
SELECT employee_id
FROM EMPLOYEES
WHERE job_id='SA_REP'
INTERSECT
SELECT employee_id
FROM EMPLOYEES e
JOIN DEPARTMENTS d USING(department_id)
WHERE d.DEPARTMENT_NAME = 'Sales';
==== EXCEPT / MINUS ====
/*
Erstelle eine Liste aller Länder, in denen es keine Departments gibt. Die Auflistung soll die country_id und country_name anzeigen.
*/
SELECT country_id, country_name
FROM COUNTRIES
EXCEPT
SELECT c.country_id, c.country_name
FROM COUNTRIES c
JOIN LOCATIONS l ON c.COUNTRY_ID = l.COUNTRY_ID
JOIN DEPARTMENTS d ON l.LOCATION_ID = d.LOCATION_ID;
-- Oder Oracle Schreibweise:
SELECT country_id, country_name
FROM COUNTRIES
MINUS
SELECT c.country_id, c.country_name
FROM COUNTRIES c
JOIN LOCATIONS l ON c.COUNTRY_ID = l.COUNTRY_ID
JOIN DEPARTMENTS d ON l.LOCATION_ID = d.LOCATION_ID;
[[opendocks:oracle-sql-nutshell-doku:nutshell-doku-05|Zurück]] - [[opendocks:oracle-sql-nutshell-doku:nutshell-doku-07|Weiter]]