我试图在PostgreSQL 9.5.2中编写这样的查询:

INSERT INTO a (id, x)
    SELECT id, x FROM b
ON CONFLICT (id) DO UPDATE
    SET x = b.x
    WHERE b.y < 100

但我得到ERROR: missing FROM-clause entry for table "b"分.我肯定缺少一些基本的东西,但是我如何引用UPDATE子句中插入的行呢?还是有别的办法?

推荐答案

冲突值可通过excluded别名获得:

INSERT INTO a (id, x)
SELECT id, x 
FROM b
ON CONFLICT (id) DO UPDATE
    SET x = excluded.x;

Postgresql相关问答推荐

在Docker Compose中获取CSV文件数据?

在PostgreSQL中是否有与SQLite R*Tree类似功能?

将列类型从文本[]更改为jsonb[]

在PostgreSQL中,`MY_VARIABLE IN(<;Long_ARRAY_of_Items>;)`何时是FAST?

包含间隔在 jooq 和 postgres 中没有按预期工作

PostgreSQL SELECT 结果具有不同的 id,它更喜欢来自另一个表的特定值

postgresql查询中的正则表达式不区分大小写

postgresql 更新错误ERROR: invalid input syntax for type boolean:

包含受先前 DELETE 影响的行数的变量?

保存 geodjango PointField 时出错

如何使用 pg_dump 或 psql 从 *.sql 恢复 PostgreSQL 表?

整数除法返回 0

LAG 函数和 GROUP BY

PostgreSQL 权限解释

如何使用 psql 命令列出、创建、使用和判断数据库?

Postgres 默认按 id 排序 - worldship

在不存在的行上有select for update块

如何将参数值添加到 pgadmin sql 查询?

在 postgres 中插入语句用于没有时区 NOT NULL 的数据类型时间戳,

如何为 Postgresql 中的所有数据库创建具有只读权限的用户?