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);
|