PostgreSQL UPSERT(可写CTE)中的不明确列使用一个表更新另一个表
我有一个名为PostgreSQL UPSERT(可写CTE)中的不明确列使用一个表更新另一个表,postgresql,recursive-query,upsert,Postgresql,Recursive Query,Upsert,我有一个名为users\u import的表,我正在解析和导入CSV文件。如果用户已经存在,我想使用该表更新我的用户表,如果不存在,则插入。(这实际上是一个非常简单的例子,我正在尝试做的事情要复杂得多。) 我正在尝试做类似的事情: 以下是表定义和查询: CREATE TABLE users ( id INTEGER NOT NULL UNIQUE PRIMARY KEY, name TEXT NOT NULL ); CREATE TABLE users_import (
users\u import
的表,我正在解析和导入CSV文件。如果用户已经存在,我想使用该表更新我的用户
表,如果不存在,则插入。(这实际上是一个非常简单的例子,我正在尝试做的事情要复杂得多。)
我正在尝试做类似的事情:
以下是表定义和查询:
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…
子句中返回的*
包含来自用户的所有列以及来自联接表用户导入的所有列。因此,结果有两列名为id
和两列名为name
,因此在引用upsert.id
时存在歧义
为了避免这种情况,如果不需要其余的列,请使用返回u.id
。在WITH upsert…
子句中的返回*
包含用户的所有列以及联接表用户导入的所有列。因此,结果有两列名为id
和两列名为name
,因此在引用upsert.id
时存在歧义
为了避免这种情况,如果不需要其他列,请使用返回u.id的。Gah。这么简单。谢谢你,嘎。这么简单。非常感谢。