我正在使用一个框架(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?我的另一个选择是破解框架,我不想这样做。
答案 0 :(得分:35)
问题是您在列中的SET
子句中包含表别名。请参阅UPDATE
in Postgres docs的文档:
column
table
中列的名称。如果需要,可以使用子字段名称或数组下标限定列名称。请勿在目标列的规范中包含表格名称 - 例如,UPDATE tab SET tab.col = 1
无效。
这在Postgres中有效:
update GREETING Greeting
set
NAME='World',
PHRASE='Hello World!'
where Greeting.ID=5 ;
答案 1 :(得分:4)
尝试使用最新的Jodd,v3.3.7。这个问题得到解决的地方。
问题出在Jodd库中:实体更新方法正在生成带有表别名的更新语句。新版本根本没有放置表别名;这适用于Postgres和其他数据库。
答案 2 :(得分:3)
检查UPDATE
语句上的文档,特别是 列 部分:在SET
子句中使用表别名为列添加前缀是违法的。
UPDATE GREETING Greeting
SET ID=5, NAME='World', PHRASE='Hello World!'
WHERE (Greeting.ID=5);
答案 3 :(得分: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
在此示例中,这有点愚蠢,因为我们不需要该别名。当涉及多个表时,这将变得更加有用。