Guten Tag, alle zusammen. Ich möchte eine Frage zu meiner SQL-Anweisung stellen. Ich verwende SQL Server 2008 und hat eine Tabelle namens Workflow-Transaktion. In dieser Tabelle habe ich 12 Datensätze. Das Bild unten ist der Inhalt der Tabelle.
Ich habe diese SQL-Anweisung:
%Vor%Mein Ziel ist es, eine Anforderungs-ID zu aktualisieren, die eine OrderNumber von weniger als dem Maximum aufweist. Dies ist die Ausgabe der SELECT-Anweisung innerhalb der WHERE-Klausel. Jetzt erwarte ich, dass die zu aktualisierenden Datensätze nur die besagten Datensätze sind (im Code ist es RequestId # 3).
Was tatsächlich passiert ist, wurde statt nur vier Datensätze aktualisiert, es wird fünf (5)! Gibt es ein Problem mit meiner bestehenden SQL-Anweisung?
Ihr Problem besteht darin, dass Sie ALLE Datensätze mit RequestId = 3 aktualisieren. Berücksichtigen Sie, dass Ihr Unterabfrageergebnis 3
lautet, damit Sie alle zugehörigen Datensätze aktualisieren.
Ihre Abfrage ist äquivalent zu
%Vor%Ich bin mir nicht sicher, ob Sie einen Grund haben, Ihre Anfrage komplexer zu machen als nötig. Scheint mir, dass etwas einfacher würde den Trick tun
%Vor%Das Problem mit Ihrer Abfrage besteht darin, dass die Unterabfrage sehr detailliert ist, um die Datensätze mit der Bestellnummer zu finden, die unter dem Maximum liegt. Und dann wählt es alles mit der gleichen Anfrage - was die maximale Bestellnummer enthalten würde.
Ich bevorzuge es, dies mit einem CTE wie folgt zu beheben:
%Vor%Ich mag diese Struktur, weil ich das CTE separat ausführen kann, um zu sehen, welche Datensätze wahrscheinlich aktualisiert werden.
Um Ihre Anfrage zu korrigieren, würden Sie die Anfrage in OrderNumber
ändern und die RequestId = 3
:
Ihre Unterabfrage hat nur gesagt, dass Sie RequestID 3 zurückgeben sollen. Sie haben also alle Anfragen mit dieser ID aktualisiert. Geh es durch. Was ich denke, dass Sie gesucht haben, war etwas wie:
%Vor%Tags und Links sql sql-server