Ein JOIN-Prädikat (join_predicate) spezifiziert einen JOIN. Ein JOIN-Prädikat kann ohne, mit einem oder mit zwei OUTER JOIN-Indikatoren angegeben werden.
<join_predicate> ::=
<expression> [<outer_join_indicator>] <comp_op>
<expression> [<outer_join_indicator>]
<outer_join_inidicator> ::= (+)
Jeder Ausdruck (expression) muß eine Spaltenspezifikation enthalten. Es muß eine Spaltenspezifikation des ersten Ausdrucks und eine Spaltenspezifikation des zweiten Ausdrucks geben, so daß sich die beiden Spaltenspezifikationen auf verschiedene Tabellennamen oder Referenznamen beziehen.
Sei x der Wert des ersten Ausdrucks und y der Wert des zweiten Ausdrucks. Die Werte x und y müssen vergleichbar sein.
Es gelten die in Vergleichsprädikat angegebenen Regeln.
Wenn mindestens ein OUTER JOIN-Indikator (outer_join_indicator) in einem JOIN-Prädikat einer Suchbedingung angegeben wird, dürfen dem entsprechenden Tabellenausdruck nur genau zwei Tabellen zugrundeliegen oder es muß folgendes gelten:
· Nur für eine der in der FROM-Klausel angegebenen Tabellen werden OUTER JOIN-Indikatoren angegeben.
· Alle JOIN-Prädikate dieser Tabelle zu genau einer anderen Tabelle enthalten jeweils den OUTER JOIN-Indikator.
· Alle anderen JOIN-Prädikate enthalten keinen OUTER JOIN-Indikator.
Wenn für einen JOIN mehr als zwei Tabellen für die QUERY-Spezifikation notwendig sind und kann eine der oben genannten Regeln nicht eingehalten werden, kann auch ein QUERY-Ausdruck in der FROM-Klausel verwendet werden.
Es werden nur solche Zeilen einer Tabelle in die Ergebnistabelle übertragen, die ein dem Vergleichsoperator (comp_op) entsprechendes Gegenstück in der anderen im JOIN-Prädikat angegebenen Tabelle haben.
Wenn sichergestellt werden soll, daß jede
Zeile einer Tabelle mindestens einmal in der Ergebnistabelle enthalten ist,
muß der OUTER JOIN-Indikator auf der Seite des Vergleichsoperators angegeben
werden, auf der die andere Tabelle spezifiziert ist.
Es wird dann (wenn für eine Zeile einer Tabelle nicht mindestens ein
Gegenstück in der anderen Tabelle gefunden werden kann) aus der Tabelle
trotzdem eine Zeile für die Ergebnistabelle gebildet. Dabei wird für die
Ausgabespalten, die aus Spalten der anderen Tabelle gebildet werden, der
NULL-Wert verwendet.
Da der OUTER JOIN-Indikator auf beiden Seiten des Vergleichsoperators
angegeben werden kann, wenn dem Tabellenausdruck
nur genau zwei Tabellen zugrundeliegen, kann für beide Tabellen sichergestellt
werden, daß jede Zeile mindestens einmal in der Ergebnistabelle enthalten
ist.
Das JOIN-Prädikat ist ein Spezialfall des Vergleichsprädikats. Die Anzahl der JOIN-Prädikate in einer Suchbedingung ist auf 128 beschränkt.
JOIN-Prädikat
Beispieltabellen customer, reservation
Liegt für den Kunden 'Porter' eine Buchung vor? Wenn ja, wann?
SELECT reservation.rno, customer.name,customer.firstname, reservation.arrival, departure
FROM customer, reservation
WHERE customer.name = 'Porter' AND customer.cno = reservation.cno
RNO |
NAME |
FIRSTNAME |
ARRIVAL |
DEPARTURE |
100 |
Porter |
Jenny |
13/11/2001 |
15/11/2001 |
110 |
Porter |
Jenny |
24/12/2001 |
06/01/2002 |
120 |
Porter |
Martin |
14/11/2001 |
18/11/2002 |
Angabe eines OUTER JOIN-Indikators
Beispieltabellen hotel, reservation
Liste aller Hotels in Los Angeles, zu denen Buchungen existieren und ebenfalls die, für die keine Buchung existiert: Der fehlende Eintrag einer Buchungsnummer wird mit einem NULL-Wert belegt.
SELECT hotel.hno, hotel.name, reservation.rno
FROM hotel, reservation
WHERE hotel.city = 'Los Angeles' AND hotel.hno = reservation.hno (+)
HNO |
NAME |
RNO |
80 |
Midtown |
100 |
50 |
Lake Michigan |
120 |
80 |
Midtown |
140 |
120 |
Sunshine |
180 |
40 |
Eigth Avenue |
? |