使用子查询中的数据时如何升序(Postgres)

时间:2019-10-06 17:15:33

标签: sql postgresql subquery upsert

我有两个表:

  • assignments {recceptacleId, assignedCarrier}
  • rls_permissions {receptacleId, rlsUserId}

在这种情况下,指的是任何承运人与航空公司之间的关系。

每当有新任务分配到assignments表中时,我都想在我的rls_permissions表中进行增补(插入新行或更新(如果已将现有容器分配给新的航空公司))

我在upsert中遇到的问题,特别是ON CONFLICT ON CONSTRAINT,是我的插入语句包含要插入的数据的子查询,因此我不确定如何编写其中的DO UPDATE SET部分声明

我已经尝试使用“排除”来尝试根据先前的冲突来选择要更新的assignedCarrier,但是我一直收到“错误:排除的列。receptacleId不存在”

我的pkey看起来像这样:

CREATE UNIQUE INDEX rls_permissions_pkey ON rls_permissions("receptacleId" text_ops);

虚拟数据可能是:

receptacleID    assignedCarrier
aaaaaaaaaa00    AA               

AA在哪里是“美国航空公司”

INSERT INTO rls_permissions ("receptacleId","rlsUserId") 
SELECT DISTINCT assignments."receptacleId", assignments."assignedCarrier" 
FROM assignments
ON CONFLICT ON CONSTRAINT rls_permissions_pkey
DO UPDATE SET "rlsUserId" = (SELECT DISTINCT assignments."assignedCarrier" 
                             FROM assignments 
                             WHERE assignments."receptacleId" = excluded."receptacleId");

例外结果是,如果没有冲突,则将从子查询返回的数据插入到权限表的新行中。

如果发生冲突,我只想更新新分配的运营商,而不更新或插入新行,因为该插座已经存在。

1 个答案:

答案 0 :(得分:0)

在UPDATE部分中不需要子查询。您可以通过excluded关键字来访问INSERT部分的值。

INSERT INTO rls_permissions ("receptacleId","rlsUserId") 
SELECT DISTINCT assignments."receptacleId", assignments."assignedCarrier" 
FROM assignments
ON CONFLICT ON CONSTRAINT rls_permissions_pkey
DO UPDATE SET "rlsUserId" = excluded."rlsUserId";

excluded."rlsUserId"的引用是指将被插入到rlsUserId列中的值,因此它是通过assignments."assignedCarrier"从SELECT语句中检索到的值。