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

ANSI Jointyper i Oracle

1. ANSI Jointyper
2. INNER
3. LEFT
4. RIGHT
5. FULL
6. CROSS

1. ANSI Jointyper

Syntaxen för jointyp är för ANSI-SQL följande:
INNER | {LEFT | RIGHT | FULL} [OUTER] | CROSS
Defaultvärdet är INNER. 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.
  • Equi Join:FULL OUTER: Som ovan men alla rader från den högra och den vänstra 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
JOIN dep ON(dep.dep_pk=emp.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
LEFT OUTER JOIN dep ON(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.
Nyckelordet OUTER är frivilligt.

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
RIGHT OUTER JOIN dep ON(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.
Nyckelordet OUTER är frivilligt.

5. FULL

FULL JOIN är LEFT JOIN kombinerat med RIGHT JOIN. :
SQL>  SELECT first_name, last_name, dep_name
FROM emp
FULL OUTER JOIN dep ON(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
                                  Handläggare
                                  Arkitektgruppen
                                  Microsoft-utveckling

9 rader.
Nyckelordet OUTER är frivilligt.

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 
Denna typ av join används sällan, eftersom operationen är trivial och inte säger speciellt mycket. Den relation som med primär nyckel och referensnyckel kopplar samman tabellerna används inte ens. Ett exempel:
SQL>  SELECT first_name, last_name, dep_name
FROM emp
FULL CROSS JOIN 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.