Discussion:
Reihenfolge bei left outer join
(zu alt für eine Antwort)
Michael Schuerig
2007-01-04 02:27:33 UTC
Permalink
Bei einem left outer join kann eine Zeile der linksseitigen
Eingabetabelle mit mehreren Zeilen der rechtsseitigen Eingabetabelle
verknüpft sein. Ein solcher join kann also zu mehreren Zeilen im
Ergebnis führen.

Ich wüßte nun gerne, ob die Ergebniszeilen für eine linksseitige
Eingabezeile immer unmittelbar aufeinander folgen. Das kann ich
natürlich per Sortierung erzwingen, aber darauf würde ich, wenn
möglich, gerne verzichten.

Beispiel:

SELECT * FROM personen
LEFT OUTER JOIN adressen ON personen.id = adressen.person_id

Ist dann sicher, dass alle Zeilen, die sich auf dieselbe Person
beziehen, hinter einander stehen? Muss ich dazu sortieren oder läßt
sich das auch anders, kostengünstiger, erreichen?

Michael
--
Michael Schuerig
mailto:***@schuerig.de
http://www.schuerig.de/michael/
Joachim Pense
2007-01-04 05:48:04 UTC
Permalink
Post by Michael Schuerig
Ich wüßte nun gerne, ob die Ergebniszeilen für eine linksseitige
Eingabezeile immer unmittelbar aufeinander folgen. Das kann ich
natürlich per Sortierung erzwingen, aber darauf würde ich, wenn
möglich, gerne verzichten.
Wird kein "order by" verwendet, dann ist die Reihenfolge der
Ergebniszeilen in SQL prinzipiell undefiniert. Daher: lieber nicht
darauf verzichten.

Joachim
Torsten Schneider
2007-01-04 07:18:26 UTC
Permalink
Post by Michael Schuerig
SELECT * FROM personen
LEFT OUTER JOIN adressen ON personen.id = adressen.person_id
Ist dann sicher, dass alle Zeilen, die sich auf dieselbe Person
beziehen, hinter einander stehen? Muss ich dazu sortieren oder läßt
sich das auch anders, kostengünstiger, erreichen?
Das Kostengünstige daran ist eben, dass normalerweise nicht sortiert
wird. Wenn man nur die Daten benötigt, ohne auf irgendwelche
Reihenfolgen Wert zu legen, wäre es viel zu teuer, irgendeine
implizite Reihenfolge zu erwarten, von daher ist die Reihenfolge bei
SELECTs grundsätzlich undefiniert, wenn man kein explizites ORDER BY
angibt.

Bei PostgreSQL ist es beispielsweise so, dass es einen Einfluss auf die
Ausgabe eines nicht sortierten SELECTs hat, wann ein Datensatz das
letzte Mal per UPDATE angefasst wurde. Das deckt sich aus o.g. Gründen
zu 100% mit den SQL-Spezifikationen.


Grüße, Torsten
Nils Ketelsen
2007-01-04 09:18:27 UTC
Permalink
Post by Michael Schuerig
Ich wüßte nun gerne, ob die Ergebniszeilen für eine linksseitige
Eingabezeile immer unmittelbar aufeinander folgen. Das kann ich
natürlich per Sortierung erzwingen, aber darauf würde ich, wenn
möglich, gerne verzichten.
SQL ist konzeptionell Mengenorientiert. Und Mengen haben keine Reihenfolge.

Erst mit Zusazufunktionen (wie order by) entsteht eine Liste, also etwas mit
definierter Reihenfolge.
Post by Michael Schuerig
SELECT * FROM personen
LEFT OUTER JOIN adressen ON personen.id = adressen.person_id
Ist dann sicher, dass alle Zeilen, die sich auf dieselbe Person
beziehen, hinter einander stehen? Muss ich dazu sortieren oder läßt
sich das auch anders, kostengünstiger, erreichen?
Nein, ja, nicht das ich wüsste.

Nils
--
"Your american beer is like making love in a canoe -
fucking close to water"
[Monty Python]
Michael Schuerig
2007-01-04 09:34:46 UTC
Permalink
Post by Nils Ketelsen
Post by Michael Schuerig
Ich wüßte nun gerne, ob die Ergebniszeilen für eine linksseitige
Eingabezeile immer unmittelbar aufeinander folgen. Das kann ich
natürlich per Sortierung erzwingen, aber darauf würde ich, wenn
möglich, gerne verzichten.
SQL ist konzeptionell Mengenorientiert. Und Mengen haben keine
Reihenfolge.
Erst mit Zusazufunktionen (wie order by) entsteht eine Liste, also
etwas mit definierter Reihenfolge.
Dass mir die relationale Algebra keine Garantie der Form gibt, wie ich
sie gerne hätte, das ist mir schon klar. Ich hatte gehofft, dass sich
vielleicht durch irgendeine Annahme, die in SQL drin steckt, die von
mir gewünschte Reihenfolge ergibt.

Michael
--
Michael Schuerig
mailto:***@schuerig.de
http://www.schuerig.de/michael/
Joachim Pense
2007-01-04 21:31:06 UTC
Permalink
Post by Michael Schuerig
Post by Nils Ketelsen
Post by Michael Schuerig
Ich wüßte nun gerne, ob die Ergebniszeilen für eine linksseitige
Eingabezeile immer unmittelbar aufeinander folgen. Das kann ich
natürlich per Sortierung erzwingen, aber darauf würde ich, wenn
möglich, gerne verzichten.
SQL ist konzeptionell Mengenorientiert. Und Mengen haben keine Reihenfolge.
Erst mit Zusazufunktionen (wie order by) entsteht eine Liste, also
etwas mit definierter Reihenfolge.
Dass mir die relationale Algebra keine Garantie der Form gibt, wie ich
sie gerne hätte, das ist mir schon klar. Ich hatte gehofft, dass sich
vielleicht durch irgendeine Annahme, die in SQL drin steckt, die von
mir gewünschte Reihenfolge ergibt.
Nein - ANSI-SQL selbst sagt nur explizit, das keine Reihenfolge
erwartet werden kann, wenn man sie nicht verlangt. Man kann sich
höchstens auf die Arbeitsweise des jeweiligen DBMS verlassen. Dann ist
man vielleicht schon beim nächsten Versionswechsel verlassen.

Joachim

Loading...