37

我正在使用一个框架 (Jodd),它将表别名添加到 SQL Select 中的列名中。它看起来像格式良好的 SQL,但 Postgres 对此感到窒息。

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

给出一个错误:

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

有没有办法让 Postgres 接受那个 SQL?我的另一种选择是破解框架,我不想这样做。

4

4 回答 4

56

问题是您SET在列中包含表别名 in 子句。请参阅UPDATEPostgres 文档中的文档

column

中的列的名称table。如果需要,列名可以用子字段名或数组下标限定。不要在目标列的规范中包含表的名称——例如,UPDATE tab SET tab.col = 1是无效的。

这在 Postgres 中有效:

update GREETING Greeting 
set 
    NAME='World', 
    PHRASE='Hello World!' 
where Greeting.ID=5 ;
于 2012-07-06T21:51:53.737 回答
7

检查UPDATE语句文档,特别是部分:在SET子句中使用表别名作为列前缀是非法的。

UPDATE GREETING Greeting
   SET ID=5, NAME='World', PHRASE='Hello World!'
 WHERE (Greeting.ID=5);
于 2012-07-06T21:54:36.497 回答
4

尝试使用最新的 Jodd v3.3.7。解决此问题的地方。

问题出在 Jodd 库中:实体更新方法正在生成带有表别名的更新语句。新版本根本不放表别名;这也适用于 Postgres 和其他数据库。

于 2012-07-27T23:07:10.973 回答
0

正如其他人所说,postgres 为正在更新的列的名称使用别名是非法的,但请注意,在 rhs 表达式中使用别名是可能的(有时是必要的)。例如:

CREATE TABLE greetings (name VARCHAR(20), phrase VARCHAR(100));
INSERT INTO greetings (name, phrase);
VALUES ('palindrome_1', 'Rise to vote sir'),
       ('palindrome_2', 'Race fast, safe car');

-- You can do something like this:
UPDATE greetings g SET phrase = REVERSE (g.phrase);
                                      -- ^
                                      -- |
                                      -- +--- this works

在这个例子中这有点傻,因为我们不需要那个别名。当涉及多个表时,这变得更加有用。

于 2020-08-08T09:52:53.627 回答