Postgres n'accepte pas les alias de table avant le nom de la colonne

j'utilise un framework (Jodd) qui ajoute l'alias table aux noms de colonnes dans un Select SQL. Ça ressemble à de la SQL bien formée, mais Postgres s'y étouffe.

update GREETING Greeting 
     set Greeting.ID=5, 
         Greeting.NAME='World', 
         Greeting.PHRASE='Hello World!'  
where (Greeting.ID=5)

donne une erreur:

Error: ERROR: column "greeting" of relation "greeting" does not exist
SQLState:  42703

y a-t-il un moyen de faire accepter ce SQL par Postgres? Mon autre alternative est de pirater le cadre, je ne veux pas faire.

17
demandé sur igr 2012-07-07 01:17:19

3 réponses

Le problème est que vous incluez l'alias de la table SET l'article, dans les colonnes. Consultez la documentation de UPDATE dans Postgres docs:

column

Le nom d'une colonne dans table. Le nom de la colonne peut être qualifié avec un nom de sous-zone ou un indice de tableau, si nécessaire. Ne pas inclure le nom de la table dans la spécification d'une colonne cible - par exemple,UPDATE tab SET tab.col = 1 est invalide.

Ceci est valable dans Postgres:

update GREETING Greeting 
set 
    NAME='World', 
    PHRASE='Hello World!' 
where Greeting.ID=5 ;
28
répondu ypercubeᵀᴹ 2012-07-06 21:51:53

essayez d'utiliser le dernier Jodd, v3.3.7. où cette question est réglée.

le problème était dans la bibliothèque Jodd: les méthodes de mise à jour de l'entité généraient l'état de mise à jour avec les alias de table. La nouvelle version ne met tout simplement pas d'alias de table; cela fonctionne pour Postgres et pour d'autres bases de données aussi.

4
répondu igr 2012-07-27 23:07:10

vérifier la documentation sur UPDATE déclaration, spécifiquement pour le colonne part: il est illégal de préfixer des colonnes avec l'alias de table dans le SET l'article.

UPDATE GREETING Greeting
   SET ID=5, NAME='World', PHRASE='Hello World!'
 WHERE (Greeting.ID=5);
3
répondu vyegorov 2012-07-06 21:54:36