das Ergebnis folgender SQL-Scripts sollte eigentlich äquivalent sein:
aus der Tabelle myTable, die die Spalten id (NUMERIC) und wert (NUMERIC) enthält, soll die id selektiert werden und in der Ausgabe jeder id eine Zufallszahl Sort zugeordnet werden.
Das Ergebnis soll anschließend nach Sort geordnet werden.
Nun habe ich festgestellt, dass Script 1 die Ausgabe nicht nach der Spalte Sort sortiert, während Script 2 und Script 3 die Ausgabe sehr wohl sortieren.
Anscheinend ist es so, dass die Sortierung nur dann durchgeführt wird, wenn eine Operation mit dem Ergebnis von Rand() und einer Spalte erfolgt.
Wer weiß, warum das so ist?
Gruß,
Nina
P.S.: Ich kann die Scripts nicht auf einer Datenbank laufen lassen, da ich diese Woche nur auf Access zugreifen kann (und dieses kein Rand() unterstützt).
Script 1:
SELECT id, Rand() AS Sort
FROM myTable
ORDER BY Sort
Script 2:
SELECT id, 0*id+Rand() AS Sort
FROM myTable
ORDER BY Sort
Script 3:
SELECT id, 0*wert+Rand() AS Sort
FROM myTable
ORDER BY Sort
Anscheinend ist es so, dass die Sortierung nur dann
durchgeführt wird, wenn eine Operation mit dem Ergebnis von
Rand() und einer Spalte erfolgt.
Genauso ist das. Die SQL-Engine aller mir bekannten Datenbanken analysiert das SQL-Statement und erstellt einen Zugriffsplan. Wenn ein Funktionsaufruf ohne Bezug auf einen Zeilenwert darin auftaucht, wird er einmal pro Statement ausgeführt, nur bei Zeilenbezug einmal pro Zeile.
Oracle, MySQL…
aber das Problem taucht bei allen RDBMS’s auf.
Genauso ist das. Die SQL-Engine aller mir bekannten
Datenbanken analysiert das SQL-Statement und erstellt einen
Zugriffsplan. Wenn ein Funktionsaufruf ohne Bezug auf einen
Zeilenwert darin auftaucht, wird er einmal pro Statement
ausgeführt, nur bei Zeilenbezug einmal pro Zeile.
Wenn ein Funktionsaufruf ohne Bezug auf einen
Zeilenwert darin auftaucht, wird er einmal pro Statement
ausgeführt, nur bei Zeilenbezug einmal pro Zeile.
in diesem Fall würde aber das Rand() nur einmal ausgeführt werden (oder hab ich das falsch verstanden?).
Ein anderer Nutzer, der Zugriff auf die DB hat, hat die Scripts letzte Woche ausgeführt.
Soviel ich weiß, sieht seine Ergebnistabelle so aus, dass sehr wohl jeder ID eine Zufallszahl zugeordnet wird… (allerdings, wie gesagt, keine Sortierung erfolgt)
in diesem Fall würde aber das Rand() nur einmal ausgeführt
werden (oder hab ich das falsch verstanden?).
Nein, so habe ich es geschrieben.
Ein anderer Nutzer, der Zugriff auf die DB hat, hat die
Scripts letzte Woche ausgeführt.
Soviel ich weiß, sieht seine Ergebnistabelle so aus, dass sehr
wohl jeder ID eine Zufallszahl zugeordnet wird… (allerdings,
wie gesagt, keine Sortierung erfolgt)
Sieht denn sein Statement genauso aus (select… rand() as sort… order by sort), oder steht in der Order-Klausel ein eigener Rand()-Aufruf (Select… Rand() as sort… order by rand(); )?
Allerdings kann ich deine Beispiele nicht testen, da ich unter Oracle keine Funktion Rand () habe.