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.


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.


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';

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';

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.