sql - 如何从 PostgreSQL 中的 WITH 返回 EXCLUDED?
问题描述
我希望能够EXCLUDED
在处理后使用记录的值ON CONFLICT
CREATE TABLE test_table (some_num INT UNIQUE);
INSERT INTO test_table (some_num) VALUES(1);
WITH ex AS (
INSERT INTO test_table (some_num) VALUES(1)
ON CONFLICT (some_num) DO NOTHING
RETURNING EXCLUDED.*
)
SELECT * FROM ex;
但是,当我这样做时,我收到以下错误:
Query Error: error: missing FROM-clause entry for table "excluded"
我相信这是因为在WITH
子句之外,EXCLUDED
表不再能够被引用。有没有办法EXCLUDED
从WITH
子句之外引用表?
解决方案
更暴力的方法应该有效。将要插入的行存储在单独的 CTE 中。然后您可以删除插入的那些:
WITH to_insert (some_num) as (
VALUES (1), (2), (3)
),
i AS (
INSERT INTO test_table (some_num)
SELECT *
FROM to_insert
ON CONFLICT (some_num) DO NOTHING
RETURNING *
)
SELECT ti.some_num
FROM to_insert ti
WHERE NOT EXISTS (SELECT 1 FROM i WHERE i.some_num = ti.some_num);
这是一个 db<>fidde。
推荐阅读
- python - selenium.common.exceptions.InvalidSessionIdException:消息:无效的会话 ID
- javascript - Angular Route 参数以匹配正则表达式模式
- javascript - 在适合时间的时间线图上放置不同的事件
- reactjs - 反应引导卡不会显示
- xss - elm中的XSS攻击块有多严重?
- apache-kafka - kafka java客户端是否提供进程级(系统变量)属性支持?
- roblox - 将 gui 元素放在 roblox 中的拇指杆下方
- javascript - 在 TypeScript 中使用 NextJS 设置 Jest + React 测试库 -- 设置 upp jest.config.js 时出错
- azure - 应用迁移脚本不起作用,没有要部署的文件
- database - 如何授予postgres中所有数据库的所有权限