Comment écrire UPDATE SQL avec un alias de table dans SQL Server 2008?

213

J'ai un très basique UPDATE SQL-

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

Cette requête fonctionne bien dans Oracle, Derby, MySQL- mais il échoue dans SQL Server 2008 avec l' erreur suivante:

"Msg 102, niveau 15, état 1, ligne 1 syntaxe incorrecte près de" Q "."

Si je supprime toutes les occurrences de l'alias, "Q" de SQL, alors cela fonctionne.

Mais je dois utiliser l'alias.

javauser71
la source
5
Pourquoi avez-vous besoin d'utiliser un alias? Il ne semble pas que vous en ayez besoin.
Mark Byers
5
Oui - du point de vue de la programmation, je n'en ai pas besoin. Mais j'ai une bibliothèque existante / ancienne qui génère toutes sortes de SQL DML avec des alias de table. La bibliothèque a beaucoup de classes avec une sorte de logique complexe. Désormais, se débarrasser des alias de table dans la bibliothèque est plus de travail que de peaufiner la logique existante pour fonctionner avec MSSQL. De plus, lorsque plusieurs tables sont impliquées, j'ai besoin d'avoir un alias de table.
javauser71

Réponses:

422

La syntaxe d'utilisation d'un alias dans une instruction de mise à jour sur SQL Server est la suivante:

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

Cependant, l'alias ne devrait pas être nécessaire ici.

Mark Byers
la source
2
Oui !!! Ça marche. Merci pour la réponse rapide. Par hasard, savez-vous pourquoi le serveur MSSQL prend en charge une telle syntaxe non conventionnelle pour la mise à jour?
javauser71
3
Mark Byers - Excellente réponse !! Cette syntaxe me permet d'ajouter une instruction Select mise en commentaire, ce qui me permet de tester la mise à jour en faisant d'abord la sélection (mettre en surbrillance de la sélection vers le bas et exécuter):SET Q.TITLE = 'TEST' -- SELECT *
2
Agréable. Cela facilite l'utilisation d'intellisense dans la clause where.
Magnus
Ce n'est pas un alias. C'est juste le nom complet de 'table.column': - /
ScottWelker
18

Vous pouvez toujours adopter l' approche CTE (Common Tabular Expression).

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

UPDATE updateCTE
SET TITLE = 'TEST';
Ryk
la source
Oui - ça marche aussi. Mais pour un programme JDBC / Java, c'est une sorte de syntaxe complexe. Merci pour votre réponse.
javauser71
-1

Cas particulier pour Postgres

Une liste des solutions ci-dessus ne fonctionnerait pas pour moi. Alors, voici la solution pour Postgres

Comme je suis un feu ma requête

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

Résultat: ERREUR: la colonne "q" de la relation "table" n'existe pas

Solution: vous n'avez pas besoin d'utiliser allis sur la valeur de données SET

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';
Ronak Patel
la source
Salut Ronak, downvoting your answer as it is for Postgres and there is already a working solution for T-SQL above above.
Alpi Murányi
hii @ AlpiMurányi pouvez-vous me suggérer la solution qui fonctionne dans mon cas. afin que je puisse mettre en œuvre, déjà mentionné Erreur dans ma réponse
Ronak Patel
Cher @Ronak, votre cas est différent de celui de l'affiche originale, par conséquent, il doit être discuté dans un commentaire (pas dans une réponse) ou publié dans une toute nouvelle question.
Alpi Murányi