Come scrivere UPDATE SQL con alias di tabella in SQL Server 2008?


213

Ho una base UPDATE SQL-

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

Questa query funziona bene in Oracle, Derby, MySQL- ma non in SQL Server 2008 con seguente errore:

"Messaggio 102, livello 15, stato 1, riga 1 Sintassi errata vicino a 'Q'."

Se rimuovo tutte le occorrenze dell'alias, "Q" da SQL allora funziona.

Ma devo usare l'alias.


5
Perché è necessario utilizzare un alias? Non sembra che tu ne abbia bisogno.
Mark Byers,

5
Sì, dal punto di vista della programmazione non ne ho bisogno. Ma ho una libreria esistente / vecchia che genera tutti i tipi di SQL DML con alias di tabella. La biblioteca ha molte classi con una sorta di logica complessa. Ora eliminare gli alias di tabella nella libreria è più un lavoro che modificare la logica esistente per funzionare con MSSQL. Anche quando sono coinvolte più tabelle, devo avere un alias di tabella.
javauser71,

Risposte:


422

La sintassi per l'utilizzo di un alias in un'istruzione di aggiornamento su SQL Server è la seguente:

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

L'alias non dovrebbe essere necessario qui però.


2
Sì !!! Funziona. Grazie per la risposta rapida. Per caso sai perché il server MSSQL supporta tale sintassi non convenzionale per l'aggiornamento?
javauser71,

3
Mark Byers - Ottima risposta !! Questa sintassi mi consente di aggiungere un'istruzione Select commentata, che mi consente di testare l'aggiornamento eseguendo prima la selezione (evidenziare dalla selezione giù ed eseguire):SET Q.TITLE = 'TEST' -- SELECT *

2
Bello. Ciò semplifica l'uso dell'intellisense nella clausola where.
Magnus,

Questo non è un alias. Questo è solo il nome completo "table.column": - /
ScottWelker,

18

Puoi sempre adottare l'approccio CTE (Common Tabular Expression).

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

UPDATE updateCTE
SET TITLE = 'TEST';

Sì, funziona anche. Ma per un programma JDBC / Java questa è una specie di sintassi complessa. Grazie per la risposta.
javauser71,

-1

Caso speciale per Postgres

Un elenco delle soluzioni precedenti non funzionerebbe per me. Quindi, ecco la soluzione per Postgres

Dato che sono un incendio, la mia domanda

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

Risultato: ERRORE: la colonna "q" della relazione "tabella" non esiste

Soluzione Se non fosse necessario utilizzare allis sul valore dei dati SET

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

Ciao Ronak, declassando la tua risposta com'è per Postgres e sopra c'è già una soluzione funzionante per T-SQL.
Alpi Murányi,

hii @ AlpiMurányi mi puoi suggerire qual è la soluzione funzionante nel mio caso. in modo che io possa implementare, già citato Errore nella mia risposta
Ronak Patel,

Caro @Ronak, il tuo caso è diverso da quello del Poster originale, quindi dovrebbe essere discusso in un commento (non in una risposta) o pubblicato come una domanda completamente nuova.
Alpi Murányi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.