Wie schreibe ich UPDATE SQL mit Tabellenalias in SQL Server 2008?

212

Ich habe eine sehr grundlegende UPDATE SQL-

UPDATE HOLD_TABLE Q SET Q.TITLE = 'TEST' WHERE Q.ID = 101;

Diese Abfrage läuft gut in Oracle, Derby, MySQL- aber es nicht in SQL Server 2008 mit folgenden Fehlern:

"Nachricht 102, Ebene 15, Status 1, Zeile 1 Falsche Syntax in der Nähe von 'Q'."

Wenn ich alle Vorkommen des Alias ​​"Q" aus SQL entferne, funktioniert es.

Aber ich muss den Alias ​​verwenden.

javauser71
quelle
5
Warum müssen Sie einen Alias ​​verwenden? Es scheint nicht so, als ob du es brauchst.
Mark Byers
5
Ja - aus Programmiersicht brauche ich es nicht. Aber ich habe eine vorhandene / alte Bibliothek, die alle Arten von DML-SQLs mit Tabellenaliasnamen generiert. Die Bibliothek hat viele Klassen mit einer Art komplexer Logik. Das Entfernen von Tabellen-Aliasen in der Bibliothek ist jetzt mehr Arbeit als das Optimieren der vorhandenen Logik für MSSQL. Auch wenn mehrere Tabellen beteiligt sind, muss ich einen Tabellenalias haben.
javauser71

Antworten:

421

Die Syntax für die Verwendung eines Alias ​​in einer Update-Anweisung unter SQL Server lautet wie folgt:

UPDATE Q
SET Q.TITLE = 'TEST'
FROM HOLD_TABLE Q
WHERE Q.ID = 101;

Der Alias ​​sollte hier allerdings nicht notwendig sein.

Mark Byers
quelle
2
Ja !!! Es klappt. Danke für die schnelle Antwort. Wissen Sie vielleicht, warum der MSSQL-Server eine so unkonventionelle Syntax für Updates unterstützt?
javauser71
3
Mark Byers - Großartige Antwort !! Diese Syntax ermöglicht es mir, eine auskommentierte Select-Anweisung hinzuzufügen, mit der ich das Update testen kann, indem ich zuerst die Auswahl durchführe (von der Auswahl nach unten markieren und ausführen):SET Q.TITLE = 'TEST' -- SELECT *
2
Nett. Dies erleichtert die Verwendung von Intellisense in der where-Klausel.
Magnus
Das ist kein Alias. Das ist nur der vollständig qualifizierte Name 'table.column': - /
ScottWelker
17

Sie können jederzeit den CTE- Ansatz (Common Tabular Expression) verwenden.

;WITH updateCTE AS
(
    SELECT ID, TITLE 
    FROM HOLD_TABLE
    WHERE ID = 101
)

UPDATE updateCTE
SET TITLE = 'TEST';
Ryk
quelle
Ja - es funktioniert auch. Für ein JDBC / Java-Programm ist dies jedoch eine Art komplexe Syntax. Vielen Dank für Ihre Antwort.
javauser71
-1

Sonderfall für Postgres

Eine Liste der oben genannten Lösungen würde für mich nicht funktionieren. Also, hier Lösung für Postgres

Da ich ein Feuer bin meine Frage

UPDATE table Q SET Q.is_active = FALSE ,Q.is_delete = TRUE WHERE Q.name = 'XYZ';

Ergebnis: FEHLER: Spalte "q" der Beziehung "Tabelle" existiert nicht

Lösung Wäre es, dass Sie nicht allis für den SET-Datenwert verwenden müssen

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';
Ronak Patel
quelle
Hallo Ronak, ich stimme deine Antwort wie für Postgres ab und es gibt bereits eine funktionierende Lösung für T-SQL.
Alpi Murányi
hii @ AlpiMurányi können Sie mir vorschlagen, welche Lösung in meinem Fall funktioniert. damit ich implementieren kann, bereits erwähnter Fehler in meiner Antwort
Ronak Patel