SQL DB2 Frage zu Joins

HelloSpencer

Ensign
Registriert
März 2011
Beiträge
137
Hallo,

ich versuche mir gerade etwas SQL (DB2) beizubringen. Es klappt auch soweit ganz gut, jedoch verstehe ich einen Ausdruck bei dieser SQL Anweisung nicht. Finde auch im Internet nichts dazu, was aber auch daran liegt, da ich nicht weiß was es sein soll.

In dem Beispiel habe ich diese Tabelle hier:
suppliers.PNG

Das ist die SQL Anweisung, mit der die Personen die in der gleichen Stadt wohnen mittels einem Join verbunden werden.
Code:
SELECT a.sno AS sno_1
, a.city AS city_1
, b.sno AS sno_2
, b.city AS city_2
FROM suppliers AS a
INNER JOIN suppliers AS b
ON a.city = b.city
AND a.sno < b.sno;


Das sieht dann so aus:
ergbn.PNG



Ich verstehe die SQL Anweisung nur bis zu dem AND. Für was brauche ich das a.sno < b.sno ?

Und wann muss ich bei Joins mit DB2 die Columnames umbennen, bzw muss man das immer machen ? Also a_city AS xy etc... Kann man sich das nicht auch sparen also ohne AS?
 
Mit einem Join verbindest du eigentlich 2 Tabellen.
In deinem Bsp. verbindet sich die Tabelle "suppliers" mit sich selbst. Wüsste jetzt nicht wozu man das gebrauchen kann.

Die Spaltennamen müssen immer umbenannt werden wenn durch das Join nicht eindeutig eine Spalte identifiziert werden kann.
Wenn du in deinem SQL Befehl auf die Spalte "city" zugreifst und in beiden Tabellen diese Spalte vorkommt ist nicht eindeutig geklärt welche Tabelle gemeint ist, daher die Benennung.

Der Ausdruck "a,sno < b.sno" bringt nur Element bei denen "sno" in Tabelle "a" kleiner ist als "sno" in Tabelle "b"
 
Ah danke, das mit den Spaltennamen leuchtet nun ein.

Aber zu dem logischen Ausdruck zurück. Wie kann denn a kleiner als b sein in dem Fall ? Weil die Stringlänge scheints ja nicht zu sein.
 
Ist doch ein klassischer SelfJoin:
http://wiki.selfhtml.org/wiki/Datenbank/Fortgeschrittene_Jointechniken#Der_Selfjoin

Wie Tobi richtig bemerkte, wird durch das < Zeichen gewährleistet, dass keine Doppelungen in den Beziehungen ausgegeben werden.

Sonst hättest du Beziehungen immer doppelt, nämlich S1 >> S4 sowie S4 >> S1

EDIT:
Ansonsten wird bei StackOverflow auch noch String Compare mit den < > Operatoren erklärt:
http://stackoverflow.com/questions/...mparison-greater-than-and-less-than-operators
 
Zuletzt bearbeitet:
Hi,

das ist bissl tricky und mir erscheint das Beispiel auch ein bisschen sinnbefreit, wobei ich den Kontext der Übung auch nicht kenne.

Also grundsätzlich wird die Tabelle mit sich selbst gejoined. Erste JOIN-Bedingung ist, dass die Stadt (city) übereinstimmen muss. Im Ergebnis-Bild sind die Zeilen grau, die ebenfalls im Ergebnis auftauchen würden, gäbe es die zweite JOIN-Bedingung nach dem AND nicht. Insbesondere sieht man daran, dass jede Zeile mit sich selbst gejoined würde, bspw. die letzte: "S5, Athens, S5, Athens".

Durch die zweite JOIN-Bedingung a.sno < b.sno werden 2 Dinge erreicht:

1.) Es werden keine Zeilen mit sich selbst gejoined
2.) Gibt es genau 2 unterschiedliche Zeilen, bei denen die Stadt übereinstimmt, tauchen diese nicht doppelt in der Ergebnismenge auf

Das Kriterium nach dem AND funktioniert nur, solange es nicht 3 Zeilen mit derselben Stadt gibt.
 
rust_x schrieb:
Hi,

Durch die zweite JOIN-Bedingung a.sno < b.sno werden 2 Dinge erreicht:

1.) Es werden keine Zeilen mit sich selbst gejoined
2.) Gibt es genau 2 unterschiedliche Zeilen, bei denen die Stadt übereinstimmt, tauchen diese nicht doppelt in der Ergebnismenge auf

Das Kriterium nach dem AND funktioniert nur, solange es nicht 3 Zeilen mit derselben Stadt gibt.

Also ist das a.sno < b.sno willkürlich sprich, man hätte auch b.sno < a.sno schreiben können ? Hier würden dann ja auch nicht die beiden miteinander selbstgejoined werden.

Ich finds halt komisch das es funktioniert weil der Operator auf kleiner vergleicht und der String "London" ist ja gleichlang wie der String2 "London". Das verwirrt mich etwas.
 
tobiasndw schrieb:
Die Spaltennamen müssen immer umbenannt werden wenn durch das Join nicht eindeutig eine Spalte identifiziert werden kann.
Wenn du in deinem SQL Befehl auf die Spalte "city" zugreifst und in beiden Tabellen diese Spalte vorkommt ist nicht eindeutig geklärt welche Tabelle gemeint ist, daher die Benennung.

Da muss ich dich korrigieren. Das SQL-Statement würde auch ohne die Spaltenumbenennung per AS tadellos funktionieren, weil die Tabellen ja unterschiedliche Aliase haben (a und b). Allerdings hast du dann jeweils 2 Spalten mit identischem Namen im Ergebnis, denn Spalte 1 hieße sonst nicht "a.sno", sondern SNO, genau wie Spalte 3. Das funktioniert nicht, wenn dieses SELECT bloß ein Zwischenergebnis wäre und du dann über den Spaltennamen zugreifst: Game over! :D -203: A REFERENCE TO COLUMN column-name IS AMBIGUOUS
Ergänzung ()

Deadmanshand schrieb:
Also ist das a.sno < b.sno willkürlich sprich, man hätte auch b.sno < a.sno schreiben können ?
So ist es!

Ich finds halt komisch das es funktioniert weil der Operator auf kleiner vergleicht und der String "London" ist ja gleichlang wie der String2 "London". Das verwirrt mich etwas.
Es ergibt trotzdem Sinn, denn Strings alphabetisch zu sortieren (...und darüber hinaus...) ist ja das normalste der Welt und der Operator ist von Zahlen her ja bekannt ^^
 
Zurück
Oben