2

users_importCSV ファイルを解析してインポートするテーブルがあります。そのテーブルを使用して、ユーザーが既に存在する場合はテーブルを UPDATE し、users存在しない場合は INSERT します。(これは実際には、私がやろうとしているもっと複雑なことの非常に単純化された例です。)

私はこれに非常に似た何かをしようとしています: 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とその原因は何ですか?

4

1 に答える 1

4

句のRETURNING *には、結合されたテーブルのすべての列とすべての列があります。したがって、結果には という名前の 2 つの列と という名前の 2 つの列が含まれるため、 を参照するときのあいまいさがあります。WITH upsert...usersusers_importidnameupsert.id

それを避けるにはRETURNING u.id、残りの列が必要ない場合に使用します。

于 2013-02-14T20:13:31.220 に答える