gpt4 book ai didi

postgresql - PostgreSQL UPSERT(可写 CTE)中的歧义列使用一个表更新另一个表

转载 作者:行者123 更新时间:2023-11-29 12:00:39 25 4
gpt4 key购买 nike

我有一个名为 users_import 的表,我正在向其中解析和导入 CSV 文件。如果用户已经存在,我想使用该表更新我的 users 表,或者如果它不存在则插入。 (这实际上是我正在尝试做的更复杂的事情的一个非常简化的例子。)

我正在尝试做一些与此非常相似的事情: https://stackoverflow.com/a/8702291/912717

这里是表定义和查询:

CREATE TABLE users (
id INTEGER NOT NULL UNIQUE PRIMARY KEY,
name TEXT NOT NULL
);

CREATE TABLE users_import (
id INTEGER NOT NULL UNIQUE PRIMARY KEY,
name TEXT NOT NULL
);

WITH upsert AS (
UPDATE users AS u
SET
name = i.name
FROM users_import AS i
WHERE u.id = i.id
RETURNING *
)
INSERT INTO users (name)
SELECT id, name
FROM users_import
WHERE NOT EXISTS (SELECT 1 FROM upsert WHERE upsert.id = users_import.id);

该查询给出了这个错误:

psql:test.sql:23: ERROR:  column reference "id" is ambiguous
LINE 11: WHERE NOT EXISTS (SELECT 1 FROM upsert WHERE upsert.id = us...
^

为什么 id 不明确,是什么原因造成的?

最佳答案

WITH upsert... 子句中的 RETURNING * 包含来自 users 的所有列和来自连接表 的所有列用户导入。因此结果有两列名为 id 和两列名为 name,因此在引用 upsert.id 时会产生歧义。

为避免这种情况,如果不需要其余列,请使用 RETURNING u.id

关于postgresql - PostgreSQL UPSERT(可写 CTE)中的歧义列使用一个表更新另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882408/

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