Jak napisać UPDATE SQL z aliasem tabeli w SQL Server 2008?

213

Mam bardzo podstawowy UPDATE SQL-

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

Ta kwerenda działa poprawnie w Oracle, Derby, MySQL- ale nie w serwerze SQL 2008 z następującym błędem:

„Msg 102, poziom 15, stan 1, wiersz 1 Niepoprawna składnia w pobliżu„ Q ”.”

Jeśli usunę wszystkie wystąpienia aliasu „Q” z SQL, to zadziała.

Ale muszę użyć aliasu.

javauser71
źródło
5
Dlaczego potrzebujesz użyć aliasu? Nie wydaje się, że potrzebujesz.
Mark Byers,
5
Tak - z perspektywy programowania nie potrzebuję tego. Ale mam istniejącą / starą bibliotekę, która generuje wszelkiego rodzaju SQL-y DML z aliasami tabel. Biblioteka ma wiele klas z rodzajem złożonej logiki. Pozbycie się aliasów tabel w bibliotece to więcej pracy niż udoskonalenie istniejącej logiki, aby działała na MSSQL. Również, gdy w grę wchodzi wiele tabel, muszę mieć alias tabeli.
javauser71

Odpowiedzi:

422

Składnia użycia aliasu w instrukcji aktualizacji na serwerze SQL jest następująca:

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

Alias ​​nie powinien być tutaj konieczny.

Mark Byers
źródło
2
Tak !!! To działa. Dziękuję za szybką odpowiedź. Czy przypadkiem wiesz, dlaczego serwer MSSQL obsługuje tak niekonwencjonalną składnię aktualizacji?
javauser71
3
Mark Byers - Świetna odpowiedź !! Ta składnia pozwala mi dodać komentowaną instrukcję Select, która pozwala mi przetestować aktualizację, wykonując najpierw select (zaznacz od dołu w dół i wykonaj):SET Q.TITLE = 'TEST' -- SELECT *
2
Miły. Ułatwia to korzystanie z inteligencji w klauzuli where.
Magnus
To nie jest alias. To tylko w pełni kwalifikowana nazwa „table.column”: - /
ScottWelker
18

Zawsze możesz zastosować podejście CTE (Common Tabular Expression).

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

UPDATE updateCTE
SET TITLE = 'TEST';
Ryk
źródło
Tak - to też działa. Ale dla programu JDBC / Java jest to rodzaj złożonej składni. Dzięki za twoją odpowiedź.
javauser71
-1

Specjalna skrzynka dla Postgres

Lista powyższych rozwiązań nie działałaby dla mnie. Oto rozwiązanie dla Postgres

Jak jestem ogniem moje zapytanie

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

Wynik: BŁĄD: kolumna „q” relacji „tabela” nie istnieje

Rozwiązanie Czy nie musisz używać allis dla wartości danych SET

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';
Ronak Patel
źródło
Cześć Ronak, przegłosowałem twoją odpowiedź tak, jak w przypadku Postgres, a powyżej jest już działające rozwiązanie dla T-SQL.
Alpi Murányi
hii @ AlpiMurányi czy możesz mi zasugerować, jakie rozwiązanie działa w moim przypadku. abym mógł wdrożyć, w swojej odpowiedzi wspomniałem już o błędzie
Ronak Patel,