Berechnung SQL Server ROW_NUMBER() ÜBER() für eine abgeleitete Tabelle

In einigen anderen Datenbanken (z.B. DB2 oder Oracle mit ROWNUM), kann ich das weglassen der ORDER BY - Klausel in einer ranking-Funktion OVER() - Klausel. Zum Beispiel:

ROW_NUMBER() OVER()

Dies ist besonders nützlich, wenn mit bestellt, abgeleitete Tabellen, wie zum Beispiel:

SELECT t.*, ROW_NUMBER() OVER()
FROM (
    SELECT ...
    ORDER BY
) t

Wie kann diese emuliert werden in SQL Server? Ich habe Menschen gefunden, die mit diese trick, aber das ist falsch, wie Verhalten sich nicht-deterministisch in Bezug auf die Reihenfolge von den abgeleiteten Tabelle:

-- This order here ---------------------vvvvvvvv
SELECT t.*, ROW_NUMBER() OVER(ORDER BY (SELECT 1))
FROM (
    SELECT TOP 100 PERCENT ...
    -- vvvvv ----redefines this order here
    ORDER BY
) t

Einem konkreten Beispiel (wie gesehen werden kann, auf SQLFiddle):

SELECT v, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM (
  SELECT TOP 100 PERCENT 1 UNION ALL
  SELECT TOP 100 PERCENT 2 UNION ALL
  SELECT TOP 100 PERCENT 3 UNION ALL
  SELECT TOP 100 PERCENT 4
  -- This descending order is not maintained in the outer query
  ORDER BY 1 DESC
) t(v)

Ich kann auch nicht wiederverwenden eines Ausdrucks aus der abgeleiteten Tabelle zu reproduzieren, die ORDER BY Klausel in meinem Fall, da die abgeleitete Tabelle ist möglicherweise nicht verfügbar, da es möglicherweise durch eine externe Logik.

Also, wie kann ich es tun? Kann ich es überhaupt tun?

wie wäre SELECT NULL? wird es immer noch geben ungültiges Ergebnis?
Ja. Gut, das Ergebnis ist offensichtlich "gültig", aber ich Frage mich, ob das Verhalten eines leeren OVER() ist wirklich gut definiert, oder, wenn diese Werke durch Zufall auf DB2... ich mache ein SQL Fiddle, das zu verdeutlichen
Sie müssen die row_number auf die innere Abfrage, also Wenn Sie können nicht ändern das ich denke, Sie sind aus Glück heraus.
Es gibt zwei Probleme. 1) ich nicht unbedingt haben Zugang zu der inneren Abfrage, 2) die innere Abfrage enthalten könnte DISTINCT, bei denen das hinzufügen ROW_NUMBER() zu einer Veränderung der Semantik der inneren Abfrage.
Gut ist das, was glaube als gut. Aber ich möchte wissen 😉

InformationsquelleAutor Lukas Eder | 2013-09-23

Schreibe einen Kommentar