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

Oracle join

1. Oracle join
2. INNER
3. LEFT
4. RIGHT
5. FULL
6. CROSS

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:
WHERE t1.col1 =t2.col1
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.