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

ANSI Join-syntax i Oracle

1. ANSI Join
2. NATURAL-syntax
3. USING-syntax
4. ON-syntax
5. Exempel med 2 tabeller
6. Exempel med 3 tabeller

1. ANSI Join

Eftersom Oracle vill följa ANSI-standarden bättres finns stöd för ANSI Join från och med Oracle9i. Förr eller senare kommer Oracles egna Joinsyntax att tas bort, så för att få en lång livslängd på sin kod bör man använda den nya syntaxen redan nu. På denna sida kommer 3 olika skrivsätt att gås igenom, men oavsett hur mas skriver kommer samma Equi Join-operation att utföras.

  • Med ANSI Join kan man endast utföra Equi Join, d.v.s. att värdena i kolumnerna måste vara identiska för att få en match.
Det finns 3 olika syntaxer för ANSI Join:
  • NATURAL: Med denna metod utför Oracle en Equi Join på alla kolumner med samma namn i tabellerna.
  • USING(col_list): Med denna metod utför Oracle en Equi Join på de kolumner i col_list som finns i båda tabellerna. Alltså man får en begränsad NATURAL JOIN som bara gäller vissa av de gemensamma kolumnerena.
  • ON(col_cond): Med denna metod utför Oracle en Join enligt de specifierade villkoren i col_cond. Med denna metod behöver den primära nyckeln och den refererande nyckeln inte heta samma sak.

2. NATURAL-syntax

Med denna metod utför Oracle en Equi Join på alla gemensamma kolumner ( kolumner med samma namn) i tabellerna. Nedan visas syntaxen för NATURAL JOIN:
SELECT ...
FROM tab
NATURAL [join_type] JOIN tab
[NATURAL [join_type] JOIN tab]
[WHERE ...]
[ORDER BY ...]
Så här definieras join_type:
INNER | {LEFT|RIGHT|FULL} [OUTER]
Så här definieras tab:
[schema.]{<table>|<view>|<other>} [alias]

3. USING-syntax

Med denna metod utför Oracle en Equi Join på tabellerna med de gemensamma kolumner i kolumnlistan. Nedan visas syntaxen för USING:
SELECT ...
FROM tab
[join_type] JOIN tab USING(col_list)
[[join_type] JOIN tab USING(col_list)]
[WHERE ...]
[ORDER BY ...]
col_list är bara en uppräkning av kolumner:
column1 [, column2 [, column3]]
Så här definieras join_type:
INNER | {LEFT|RIGHT|FULL} [OUTER]
Så här definieras tab:
[schema.]{<table>|<view>|<other>} [alias]

4. ON-syntax

Med denna metod utför Oracle en Equi Join på tabellerna på exakt det sätt du specifierar. Kolumnerna behöver inte heta samma sak i de olika tabellerna. Nedan visas syntaxen för ON:
SELECT ...
FROM tab
[join_type] JOIN tab ON(col_cond)
[[join_type] JOIN tab ON(col_cond)]
[WHERE ...]
[ORDER BY ...]
col_cond är ett antal villkor där tabellernas kolumnerna är involverade:
col1=col2 [{AND|OR} [NOT] col3=col4]
Så här definieras join_type:
INNER | {LEFT|RIGHT|FULL} [OUTER]
Så här definieras tab:
[schema.]{<table>|<view>|<other>} [alias]

5. Exempel med 2 tabeller

Vi tänker oss att vi har dessa tabeller:



Skapas med följande kommando:
SQL> CREATE TABLE dep(
    dep_pk NUMBER(10) CONSTRAINT pk_dep PRIMARY KEY,
    dep_name VARCHAR(100)
);

Tabellen är skapad.

SQL> CREATE TABLE emp(
    emp_pk NUMBER(10),
    dep_pk NUMBER(10) REFERENCES dep(dep_pk),
    first_name VARCHAR2(100),
    last_name VARCHAR2(100),
    salary NUMBER(10),
    id_nr CHAR(10)
);

Tabellen är skapad.
Vi fyller tabellerna med lite data:
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.
Först skriver vi en Join men NATURAL JOIN-syntaxen:
SQL> SELECT dep_name, first_name, last_name
FROM emp
NATURAL JOIN dep;

DEP_NAME                FIRST_NAME       LAST_NAME
----------------------- ---------------- ----------------
Ledningsgruppen         Janne            Svensson
Java-utveckling         Olle             Kullberg
Java-utveckling         Per              Johansson
Java-utveckling         Magnus           Magnusson
Här får vi en Equi Join på den primära nyckeln i DEP (DEP_PK) och referensnyckeln i EMP (DEP_PK), eftersom det inte finns några fler kolumner med samma namn i de två tabellerna. Vi kan skriva samma sats med USING-syntaxen på detta sätt:
SQL> SELECT dep_name, first_name, last_name
FROM emp
JOIN dep USING(dep_pk);

DEP_NAME                FIRST_NAME       LAST_NAME
----------------------- ---------------- ----------------
Ledningsgruppen         Janne            Svensson
Java-utveckling         Olle             Kullberg
Java-utveckling         Per              Johansson
Java-utveckling         Magnus           Magnusson
Eller med ON-syntaxen på detta sätt:
SQL> SELECT dep_name, first_name, last_name
FROM emp
JOIN dep ON(dep.dep_pk=emp.dep_pk);

DEP_NAME                FIRST_NAME       LAST_NAME
----------------------- ---------------- ----------------
Ledningsgruppen         Janne            Svensson
Java-utveckling         Olle             Kullberg
Java-utveckling         Per              Johansson
Java-utveckling         Magnus           Magnusson

6. Exempel med 3 tabeller

Vi tänker oss att vi har dessa tabeller:



Ett exempel är:
SQL> SELECT first_name, last_name, proj_name
FROM emp
NATURAL LEFT JOIN emp_proj
NATURAL JOIN proj;
Här får vi en Equi Join på den primära nyckeln i EMP (EMP_PK) och referensnyckeln i EMP_PROJ (EMP_PK). Vi får också en Equi Join på EMP_PROJ (PROJ_PK) och PROJ (PROJ_PK). I detta fall använder vi "Left Join" eftersom vi vill se alla anställda, även de som inte deltar i något projekt. Vi kan skriva samma sats med USING-syntaxen på detta sätt:
SQL> SELECT first_name, last_name, proj_name
FROM emp
LEFT JOIN emp_proj USING(emp_pk)
JOIN proj USING(proj_pk);
Och med ON-syntaxen blir det:
SQL> SELECT first_name, last_name, proj_name
FROM emp e
LEFT JOIN emp_proj ep ON(e.emp_pk=ep.emp_pk)
JOIN proj p ON(ep.proj_pk=p.proj_pk);