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。这么简单。谢谢你,嘎。这么简单。非常感谢。