【发布时间】:2018-10-25 11:09:27
【问题描述】:
我正在将查询从 Oracle 数据库更改为 PostgreSQL,在此查询中我收到此错误:
ERROR: syntax error at or near "ON"
查询是:
WITH d as (
SELECT ? AS summary, ? AS eventTime), ai as (select * from alarm)
ON (ai.fault_id=? AND ai.external_key=?)
INSERT INTO alarm AS ai(
alarm_id,
fault_id,
external_key)
VALUES (nextval('seq_alrm_instnc_alrm_instnc_id'),?,?)
ON CONFLICT DO UPDATE SET
(${buildUpdateAttributes(attributes)}
ai.summary = d.summary,
ai.system_last_update_time = default,
ai.event_sequence_number =
CASE
WHEN (d.event_number > ai.event_number) THEN d.event_number
ELSE ai.event_number
END)
我使用JDBC连接数据库,这里是调用代码
try (PreparedStatement ps = super.prepareStatement_(sql_query)) {
PreparedStatementHelper psh = new PreparedStatementHelper(ps);
psh.add(attribute1);
...
ps.execute()
我尝试了不同的方法并仔细查看了 Postgres 文档,但找不到问题所在,也没有找到针对这种特定情况的任何答案
【问题讨论】:
-
我不明白 CTE (
WITH d as ...) 应该在那里做什么。为什么要为 INSERT 的values子句中的摘要列提供值?而eventTime在后续语句中根本没有使用。而select * from alarm在该声明中毫无意义。并且别名d不包含名为event_number的列,因此引用d.event_number也是无效的。而且你不能把整个 SET 部分放在括号之间 -
尝试删除 ON 部分并将条件放在 WHERE 中。见reference
标签: java postgresql jdbc postgresql-10