【发布时间】:2013-07-08 16:03:22
【问题描述】:
我使用 CTE 编写了一个“upsert”查询,如下所示:
WITH
new_data (id, value) AS (
VALUES (1, 2), (3, 4), ...
),
updated AS (
UPDATE table t set
value = t.value + new_data.value
FROM new_data
WHERE t.id = new_data.id
RETURNING t.*
)
INSERT INTO table (id, value)
SELECT id, value
FROM new_data
WHERE NOT EXISTS (
SELECT 1 FROM updated WHERE updated.id = new_data.id
)
然后我需要在我的应用程序中使用新值,但此查询不会返回任何内容。在插入的末尾添加returning * 将返回所有插入的行,但没有更新的行。
所以,问题是(如何)我可以扩展它以返回更新的行和插入的行?
编辑:当然我可以在事务中运行它,然后是 SELECT,但是我很想知道是否有单一查询方式。
【问题讨论】:
标签: sql postgresql postgresql-9.1 common-table-expression upsert