Ich fand eine Frage beantwortet mit dem Row_Number()
Funktion in der where-Klausel . Als ich eine Abfrage versuchte, wurde folgende Fehlermeldung angezeigt:
"Meldung 4108, Ebene 15, Status 1, Zeile 1 Fensterfunktionen können nur in den Klauseln SELECT oder ORDER BY angezeigt werden."
Hier ist die Abfrage, die ich versucht habe. Wenn jemand weiß, wie man das löst, lass es mich wissen.
SELECT employee_id
FROM V_EMPLOYEE
WHERE row_number() OVER ( ORDER BY employee_id ) > 0
ORDER BY Employee_ID
sql
sql-server
tsql
analytic-functions
johnnyRose
quelle
quelle
ROW_NUMBER() OVER (ORDER BY employee_id) > 0
wird immer zuTRUE
Antworten:
Um dieses Problem zu umgehen, schließen Sie Ihre select-Anweisung in einen CTE ein. Anschließend können Sie den CTE abfragen und die Ergebnisse der Fensterfunktion in der where-Klausel verwenden.
quelle
ROW_NUMBER()
inWHERE
Klausel ohne CTE zu verwenden :(Beachten Sie, dass dieser Filter redundant ist: Er
ROW_NUMBER()
beginnt mit1
und ist immer größer als0
.quelle
AS q
stattdessen schreiben sollen , aber das würde auch funktionieren).rn
ist heutzutage ein allgemein anerkanntes Akronym für Zeilennummer. Geben Sie "row_number over as ..." in die Google-Suchzeichenfolge ein und sehen Sie, was Ihnen vorgeschlagen wird.quelle
Ich denke du willst so etwas:
quelle
From V_EMPLOYEE) A
Sie A als Alias hinzufügen.Als Antwort auf Kommentare zur Antwort von rexem, ob eine Inline-Ansicht oder ein CTE schneller wäre, habe ich die Abfragen neu gefasst, um eine Tabelle zu verwenden, die mir und allen zur Verfügung stand: sys.objects.
Die erstellten Abfragepläne waren genau gleich. Ich würde in allen Fällen erwarten, dass der Abfrageoptimierer denselben Plan erstellt, zumindest beim einfachen Ersetzen von CTE durch Inline-Ansicht oder umgekehrt.
Versuchen Sie natürlich Ihre eigenen Abfragen auf Ihrem eigenen System, um festzustellen, ob es einen Unterschied gibt.
Außerdem ist
row_number()
in der where-Klausel ein häufiger Fehler bei den Antworten zum Stapelüberlauf enthalten. Logicalyrow_number()
ist erst verfügbar, wenn die select-Klausel verarbeitet wurde. Die Leute vergessen das und wenn sie antworten, ohne die Antwort zu testen, ist die Antwort manchmal falsch. (Eine Anklage, an der ich mich schuldig gemacht habe.)quelle
Ich bin der Meinung, dass alle Antworten, die die Verwendung eines CTE oder einer Unterabfrage zeigen, ausreichende Korrekturen dafür sind, aber ich sehe niemanden, der auf den Grund geht, warum OP ein Problem hat. Der Grund, warum das, was OP vorgeschlagen hat, nicht funktioniert, liegt in der logischen Reihenfolge der Abfrageverarbeitung:
Ich glaube, dass dies einen großen Beitrag zur Antwort leistet, da es erklärt, warum Probleme wie dieses auftreten.
WHERE
wird immer verarbeitet, bevorSELECT
ein CTE oder eine Unterabfrage für viele Funktionen erforderlich wird. Sie werden dies häufig in SQL Server sehen.quelle
Verwenden von CTE (SQL Server 2005+):
Verwenden der Inline-Ansicht / Nicht-CTE-äquivalente Alternative:
quelle
SQL Server
,CTE
's und Inline-Ansichten sind dasselbe und haben dieselbe Leistung. Wenn in a nicht deterministische Funktionen verwendet werden, wird diese beiCTE
jedem Aufruf neu bewertet. Man muss schmutzige Tricks anwenden, um die Materialisierung von a zu erzwingenCTE
. Siehe diese Artikel in meinem Blog: explainextended.com/2009/07/28/… explainextended.com/2009/05/28/generating-xml-in-subqueriesbasierend auf der Antwort von OP auf die Frage:
"Methode 1" entspricht der Abfrage des OP aus der verknüpften Frage, und "Methode 2" entspricht der Abfrage aus der ausgewählten Antwort. Sie mussten sich den in dieser Antwort verknüpften Code ansehen, um zu sehen, was wirklich vor sich ging, da der Code in der ausgewählten Antwort geändert wurde, damit er funktioniert. Versuche dies:
AUSGABE:
quelle
quelle
quelle