programmera.net -> oracle -> normal     för utskrift      info@programmera.net

Sammansatta frågor i Oracle

1. Sammansatta frågor
2. UNION
3. UNION ALL
4. INTERSECT
5. MINUS

1. Sammansatta frågor

Med sammansatta frågor kan man kombinera resultaten av flera SELECT-satser. Dessa kombinationer kopplas matematiskt till mängdlära, med termer som union, snitt osv. Syntaxen för sammansatta frågor är följande:
SELECT ...
FROM ...
[WHERE (or other keyword) ...]
{UNION | UNION ALL | INTERSECT | MINUS}
SELECT ...
FROM ...
[WHERE (or other keyword) ...]
[ORDER BY ...]
ORDER BY ska stå sist och kommer att sortera resultatet av de två SELECT-satsernas sammanslagning, alltså det sista som görs innan resultatet når användaren. För att vi ska kunna ge exempel skapar vi en kopia av tabellen DEP som heter DEP_COPY. Vi har alltså följande innehåll i DEP:
SQL> SELECT * FROM dep;

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         4 Arkitektgruppen
         5 Handläggare
Vi skapar kopian DEP_COPY:
SQL> CREATE TABLE dep_copy AS 
	SELECT * FROM dep WHERE dep_pk<4;

Tabellen är skapad.

SQL> INSERT INTO dep_copy (dep_pk,dep_name) VALUES(6,'Gruvarbetare');
	INSERT INTO dep_copy (dep_pk,dep_name) VALUES(7,'Läkare');
Vi har givit DEP_COPY ett annat innehåll, de två sista raderna skiljer sig från DEP:
SQL> SELECT * FROM dep_copy;

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         6 Gruvarbetare
         7 Läkare

2. UNION

UNION returnerar unika rader från två frågor. Om det finns några dubbletter kommer dessa att sorteras ut.
SQL> SELECT * FROM dep
	UNION
SELECT * FROM dep_copy;	

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         4 Arkitektgruppen
         5 Handläggare
         6 Gruvarbetare
         7 Läkare

7 rader.
Här ser man hur dubbletterna har tagits bort.

3. UNION ALL

UNION ALL fungerar som UNION med skillnaden att dubbletter inte tas bort:
SQL> SELECT * FROM dep
	UNION ALL
SELECT * FROM dep_copy;

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         4 Arkitektgruppen
         5 Handläggare
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         6 Gruvarbetare
         7 Läkare

10 rader.

4. INTERSECT

Med INTERSECT kan man få ut alla rader som finns i båda tabellerna (snittet):
SQL> SELECT * FROM dep
	INTERSECT
SELECT * FROM dep_copy;

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling

5. MINUS

Med MINUS returneras de rader som kommer från den första SELECT-satsen minus de som returneras av den andra SELECT-satsen.
SQL> SELECT * FROM dep
	MINUS
SELECT * FROM dep_copy;

    DEP_PK DEP_NAME
---------- --------------------
         4 Arkitektgruppen
         5 Handläggare