postgresql 与Where子句冲突时插入

tzxcd3kk  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(162)

我有一个SQL查询,看起来像这样:

INSERT INTO testing.names
(
    id, 
    first_name,
    active_status
)
-------------------------------------
SELECT 
    stage.id,
    stage.first_name,
    stage.active_status
FROM 
    testing.name stage
    ON CONFLICT ON CONSTRAINT names_pkey DO UPDATE
SET 
    active_status = excluded.active_status
where
    active_status <> excluded.active_status

问题:错误信息

active_status <> excluded.active_status is ambiguous.

有人有什么建议吗?出于某种原因,它说active_status是不明确的,但只是在where子句的位置?我知道我可以用化名,但我不知道在这种情况下如何使用。

guicsvcw

guicsvcw1#

看起来我可以这样做:

INSERT INTO testing.names <place alias here>
(
    id, 
    first_name,
    active_status
)
-------------------------------------
SELECT 
    stage.id,
    stage.first_name,
    stage.active_status
FROM 
    testing.name stage
    ON CONFLICT ON CONSTRAINT names_pkey DO UPDATE
SET 
    active_status = excluded.active_status
where
    <alias from insert>.active_status <> excluded.active_status
iqih9akk

iqih9akk2#

是的,在这一点上有两个关系在起作用,“名字”和“排除”。所以它是模糊的。如果你愿意,你可以用化名,但你不需要这样做。您可以直接使用表名(不使用模式)。

where names.active_status <> excluded.active_status

对于SET,只有目标关系中的列可以被更新,所以在这种情况下没有歧义。
你可能会争辩说,唯一的替代解释是excluded.active_status <> excluded.active_status,这是没有意义的,所以它不是真正的二义性。但试图采用这种推理就太聪明了。只是在资格赛中,然后就结束了。

相关问题