Rand() und Sort

Hallo,

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

Hi,

welches RDBMS verwendest du?

Aber eigentlich ist es ziemlich egal:

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.

Gruß

J.

Hi,

welches RDBMS verwendest du?

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.

danke für die schnelle Antwort!

Gruß,
Nina

… Nachtrag:
Hi,

noch eine Frage:

du hast geschrieben:

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)

Gruß,
Nina

Hi,

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.

Dazu vielleicht noch ein Statement der Experten, die sich anerkannterweise auskennen:
http://searchdatabase.techtarget.com/ateQuestionNRes…

Für was brauchst du die zufällige Sortierung?

Gruß

J.

Hi,

Sieht denn sein Statement genauso aus

ja, es sind die Original-Statements.

Allerdings kann ich deine Beispiele nicht testen, da ich unter
Oracle keine Funktion Rand () habe.

uups, stimmt… Oracle hat kein Rand() - hier bei mir auch nicht.
wurde auf MySQL ausgeführt.

Dazu vielleicht noch ein Statement der Experten, die sich
anerkannterweise auskennen:
http://searchdatabase.techtarget.com/ateQuestionNRes…

danke!

Für was brauchst du die zufällige Sortierung?

war nur eine „Spielerei“. Wir haben festgestellt, dass das nicht funktioniert, und wollten nun wissen, warum :smile:

Gruß & Danke,
Nina