gpt4 book ai didi

sql - PostgreSQL - CTE upsert 返回修改后的行

转载 作者:行者123 更新时间:2023-11-29 11:14:54 27 4
gpt4 key购买 nike

我使用 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,但是我很想知道是否有单一查询方式。

最佳答案

尝试这样的事情:

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.*
),
inserted as (
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 id, value)
SELECT id, value
FROM inserted
UNION ALL
SELECT id, value
FROM updated

顺便说一句,这个查询不是经典的 Postgres upsert。如果有人在 UPDATE table t 进行时同时插入行,它将失败。

关于sql - PostgreSQL - CTE upsert 返回修改后的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17575489/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com