Ich habe eine kurze TSQL-Anweisung gesehen , die eine Zeichenfolge effektiv in ihre konstituierenden Zeichen aufteilt , eines pro Zeile, um den ascii
Wert für jedes Zeichen zu bewerten .
Wenn ich die Abfrage richtig und effektiv lese, werden 3 CTEs verwendet, um eine Tabelle mit 1 Spalte mit 10.000 Zeilen mit dem Wert '0' zu erstellen.
Ein vierter CTE ist wie folgt definiert:
cteTally(n) AS(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n
FROM E4
)
Anschließend wird dieser CTE mit einer Tabelle verbunden, die eine Spalte mit den interessierenden Zeichenfolgen enthält, mit den folgenden Angaben select
:
SELECT n, SUBSTRING(LastName, n, 1), ASCII( SUBSTRING(LastName, n, 1))
Das heißt, Zeilennummer n, dann das n-te Zeichen in Nachname, dann der ASCII-Wert dieses Zeichens.
Meine Fragen beziehen sich auf die over
Klausel im obigen CTE.
Was genau macht es im Wesentlichen?
Wenn wir row_number aus 10.000 identischen Zeilen abfragen, warum brauchen wir überhaupt eine order by
Klausel? Warum wird das order by
in eine over
Klausel gesetzt und nicht als order by
Klausel für die select
Anweisung - zumal die over
Klausel nicht einmal eine Partition angibt? (Ich nehme an, dies bedeutet, dass das Fenster, über das row_number
operiert wird, die vollen 10.000 Zeilen umfasst?) Und was bedeutet es, nach zu bestellen select null
?
over
Klausel sayorder by
sind optional - aber ich denke, dies bedeutet, dass Partitionen möglicherweise ohne Fensterfunktionen verwendet werden (und keine benötigenorder by
). Netter Benutzername!