PostgreSQL中使用WITH子句执行INSERT时报错:syntax error at or near "INSERT"
解决PostgreSQL 9.1中WITH子句后接INSERT的语法错误
这个报错的核心原因是PostgreSQL 9.1的语法规则限制:当WITH作为顶级语句的开头时,后续必须跟SELECT查询,不能直接衔接INSERT这类DML语句。你的写法把WITH放在了INSERT前面,违反了这个规范。
正确的写法有两种:
写法1:将WITH子句关联到INSERT的SELECT部分
把WITH放到INSERT的SELECT查询前,这是最贴合你需求的写法:
INSERT INTO cleaned WITH sq AS (SELECT * FROM input_client) SELECT * FROM weekly CROSS JOIN sq;
这里WITH属于后面的SELECT子查询的一部分,完全符合9.1的语法要求,CTE sq 可以正常被SELECT引用作为数据源。
写法2:将INSERT放入WITH子句(适合需要返回插入结果的场景)
如果需要获取插入的记录,可以把INSERT作为WITH的一个子语句,最后用SELECT返回结果:
WITH sq AS (SELECT * FROM input_client), inserted_records AS ( INSERT INTO cleaned SELECT * FROM weekly CROSS JOIN sq RETURNING * ) SELECT * FROM inserted_records;
额外提醒
确保cleaned表的列数量、顺序和数据类型,与weekly CROSS JOIN sq返回的结果集完全匹配,否则语法正确后可能会触发数据类型不匹配或列数不一致的错误。
内容的提问来源于stack exchange,提问作者datahog
相关产品推荐
相关产品推荐

