首页 > 解决方案 > 如何从 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表不再能够被引用。有没有办法EXCLUDEDWITH子句之外引用表?

标签: sqlpostgresql

解决方案


更暴力的方法应该有效。将要插入的行存储在单独的 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。


推荐阅读