1. Oracle join
Den allmänna syntaxen för Oracle Equi Join är följande:
SELECT ...
FROM tab1 t1, tab2 t2, ..
WHERE t1.col1 [(+)]=t2.col1 [(+)]
|
Nedan beskrivs hur WHERE-satsen ska se ut för de olika typerna. INNER JOIN har denna syntax:
Och en LEFT OUTER JOIN har följande syntax:
WHERE t1.col1 =t2.col1 (+)
|
En RIGHT OUTER JOIN har följande syntax:
WHERE t1.col1 (+)=t2.col1
|
Det gäller alltså att komma ihåg att plusset ska stå på höger sida för en LEFT JOIN och tvärt om. De olika jointyperna beskrivs på följande sätt:
- Equi Join:INNER: Med denna join matchas alla identiska värden mellan två kolumner. Endast de rader där samma vädrde finns i båda kolumnerna i båda tabellerna returneras som svar.
- Equi Join:LEFT OUTER: Som ovan men alla rader från den vänstra tabellen som inte gick att matcha läggs till i resultatet.
- Equi Join:RIGHT OUTER: Som ovan men alla rader från den högra tabellen som inte gick att matcha läggs till i resultatet.
- Cross Join:CROSS: Alla rader i den ena tabellen matchas mot alla rader i den andra tabellen.
I följande exempel kommer vi att använda dessa tabeller:
Tabellerna har följande innehåll:
SQL> SELECT * FROM dep;
DEP_PK DEP_NAME
---------- -----------------------
1 Ledningsgruppen
2 Java-utveckling
3 Microsoft-utveckling
4 Arkitektgruppen
5 Handläggare
SQL> SELECT * FROM emp;
EMP_PK DEP_PK FIRST_NAME LAST_NAME SALARY ID_NR
---------- ---------- ---------------- ---------------- ---------- ----------
1 1 Janne Svensson 50000 6712123223
2 2 Olle Kullberg 21000 7402191212
3 2 Per Johansson 23000 7507120101
4 2 Magnus Magnusson 32000 6609121101
5 Karl Alp 0
6 Bertil Svensson 0
6 rader.
|
2. INNER
INNER JOIN är den operation som används per default om inget annat anges. I exemplet nedan använder man INNER JOIN för att hämta avdelningsnamnet ur tabellen dep.
SQL> SELECT first_name, last_name, dep_name
FROM emp, dep
WHERE emp.dep_pk=dep.dep_pk;
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Janne Svensson Ledningsgruppen
Olle Kullberg Java-utveckling
Per Johansson Java-utveckling
Magnus Magnusson Java-utveckling
|
Här visas bara de anställda som har en avdelning knuten till sig.
3. LEFT
Med LEFT JOIN kan man addera de rader från en tabell som inte kan matchas mot en rad i den andra tabellen. I exemplet nedan vill vi göra samma JOIN som ovan med skillnaden att vi vill se alla anställda i tabellen emp, oavsett om det finns en matchning i tabellen dep eller ej:
SQL> SELECT first_name, last_name, dep_name
FROM emp, dep
WHERE emp.dep_pk=dep.dep_pk (+);
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Janne Svensson Ledningsgruppen
Magnus Magnusson Java-utveckling
Per Johansson Java-utveckling
Olle Kullberg Java-utveckling
Bertil Svensson
Karl Alp
6 rader.
|
4. RIGHT
RIGHT JOIN fungerar precis som LEFT JOIN fast man adderar rader från den andra tabellen. Därför behöve man faktiskt aldrig använda RIGHT JOIN, alla satser kan ju skrivas om som LEFT JOIN genom att man byter plats på tabellerna. I exemplet nedan vill vi att alla avdelningar i dep ska visas, oavsett om de har några anställda som jobbar där:
SQL> SELECT first_name, last_name, dep_name
FROM emp, dep
WHERE emp.dep_pk (+) =dep.dep_pk;
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Janne Svensson Ledningsgruppen
Olle Kullberg Java-utveckling
Per Johansson Java-utveckling
Magnus Magnusson Java-utveckling
Handläggare
Arkitektgruppen
Microsoft-utveckling
7 rader.
|
5. FULL
Det går inte att göra en FULL JOIN med Oracles syntax.
6. CROSS
CROSS JOIN innebär helt enkelt att man kombinerar alla rader i den ena tabellen med alla rader i den andra tabellen, en så kallad kartesisk produkt. Antal rader man får som resultat beräknas enligt följande:
Antal rader i resultatet = Antal rader i tabell 1 * Antal rader i tabell 2
|
I Oracle går det att göra en cross join genom att helt enkelt utelämna WHERE-satsen. Ett exempel:
SQL> SELECT first_name, last_name, dep_name
FROM emp, dep;
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Janne Svensson Ledningsgruppen
Olle Kullberg Ledningsgruppen
Per Johansson Ledningsgruppen
Magnus Magnusson Ledningsgruppen
Karl Alp Ledningsgruppen
Bertil Svensson Ledningsgruppen
Janne Svensson Java-utveckling
Olle Kullberg Java-utveckling
Per Johansson Java-utveckling
Magnus Magnusson Java-utveckling
Karl Alp Java-utveckling
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Bertil Svensson Java-utveckling
Janne Svensson Microsoft-utveckling
Olle Kullberg Microsoft-utveckling
Per Johansson Microsoft-utveckling
Magnus Magnusson Microsoft-utveckling
Karl Alp Microsoft-utveckling
Bertil Svensson Microsoft-utveckling
Janne Svensson Arkitektgruppen
Olle Kullberg Arkitektgruppen
Per Johansson Arkitektgruppen
Magnus Magnusson Arkitektgruppen
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Karl Alp Arkitektgruppen
Bertil Svensson Arkitektgruppen
Janne Svensson Handläggare
Olle Kullberg Handläggare
Per Johansson Handläggare
Magnus Magnusson Handläggare
Karl Alp Handläggare
Bertil Svensson Handläggare
30 rader.
|
Denna typ av join är det inte speciellt ofta man behöver använda, eftersom man inte använder referensnyckeln som kopplar samman tabellerna.