使用连接更新PostgreSQL

omtl5h9j  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(107)

我正在尝试使用连接更新一个表。其中一个连接也是自连接。
我需要用同一表中的同一列更新一列。

SERVICE ID code       value
123        QUANTITY1  2
123        QUANTITY2  null

字符串
应将数量2更新为“2”。

UPDATE "X"."ORDER_PRODUCT" op
set op."PROPERTY_VALUE"= op2."PROPERTY_VALUE" 
from "X"."ORDER_PRODUCT" op2  cross join 
"X"."ORDER_PROJECT" op3
where op."SERVICE_ID"= op2."SERVICE_ID" and op."ORDER_ID" =op3."ID" 
and op."PRODUCT_CODE" ='Tell_Datacenter_Co-location_Alan' and op2."PROPERTY_CODE" ='Quantity' 
and op."PROPERTY_CODE"='Tell_Quantity' and op."PROPERTY_VALUE" is null
and op3."PROJECT_STATUS" not in ('ProjectWF.Cancel','ProjectWF.Complete')


错误:SQL错误[42703]:错误:关系“ORDER_PRODUCT”的列“op”不存在位置:48

lnxxn5zx

lnxxn5zx1#

我会确保你有一种方法来恢复这个表之前尝试任何建议的更新查询.理想情况下,我们会看到一些样本数据在您的问题,因为我不确定如果下面的建议是有效的.

仔细考虑我生成的示例数据,请参阅:https://dbfiddle.uk/xgucUoXX也考虑结果。这将有助于您在运行数据之前优化查询。

假设你可以使用WITH,那么最简单的方法是通过一个公共表表达式:

WITH cte
AS (
    SELECT
          op.id AS old_id
        , op2.PROPERTY_VALUE AS new_value
    FROM X.ORDER_PRODUCT op
    INNER JOIN X.ORDER_PRODUCT op2 ON op.SERVICE_ID = op2.SERVICE_ID
    INNER JOIN X.ORDER_PROJECT op3 ON op.ORDER_ID = op3.ID
    WHERE op2.PROPERTY_CODE = 'Quantity'
        AND op.PROPERTY_CODE = 'Tell_Quantity'
        AND op.PROPERTY_VALUE IS NULL
        AND op3.PROJECT_STATUS NOT IN ('ProjectWF.Cancel', 'ProjectWF.Complete')
        AND op.PRODUCT_CODE = 'Tell_Datacenter_Co-location_Alan'
    )
UPDATE X.ORDER_PRODUCT
SET PROPERTY_VALUE = cte.new_value
FROM cte
WHERE X.ORDER_PRODUCT.id = cte.old_id

字符串
注:与v16一样,update命令不直接支持“join”ref.,但允许通过from子句进行多个表引用,然后通过where子句施加条件。因此,这可以在不使用WITH的情况下工作:

UPDATE X.ORDER_PRODUCT AS op
SET PROPERTY_VALUE = op2.PROPERTY_VALUE
FROM X.ORDER_PRODUCT AS op2, X.ORDER_PROJECT AS op3
WHERE 
    op.SERVICE_ID = op2.SERVICE_ID
    AND op2.PROPERTY_CODE = 'Quantity'
    AND op.ORDER_ID = op3.ID
    AND op3.PROJECT_STATUS NOT IN ('ProjectWF.Cancel', 'ProjectWF.Complete')
    AND op.PROPERTY_VALUE IS NULL
    AND op.PROPERTY_CODE = 'Tell_Quantity'
    AND op.PRODUCT_CODE = 'Tell_Datacenter_Co-location_Alan'

cx6n0qe3

cx6n0qe32#

你得到的错误是你对主表和联接表使用了相同的表别名op。要解决这个问题,你可以对主表和联接表使用不同的表别名。例如,你可以对主表使用op 1,对联接表使用op 2。

UPDATE "X"."ORDER_PRODUCT" op1
SET op1."PROPERTY_VALUE" = op2."PROPERTY_VALUE"
FROM "X"."ORDER_PRODUCT" op2
CROSS JOIN "X"."ORDER_PROJECT" op3
WHERE op1."SERVICE_ID" = op2."SERVICE_ID"
  AND op1."ORDER_ID" = op3."ID"
  AND op1."PRODUCT_CODE" = 'Tell_Datacenter_Co-location_Alan'
  AND op2."PROPERTY_CODE" = 'Quantity'
  AND op1."PROPERTY_CODE" = 'Tell_Quantity'
  AND op1."PROPERTY_VALUE" IS NULL
  AND op3."PROJECT_STATUS" NOT IN ('ProjectWF.Cancel', 'ProjectWF.Complete');

字符串
在这个更新的查询中,我为“X”.“ORDER_PRODUCT”表的第二个示例使用了不同的别名,这是自连接正确工作所必需的。查询现在应该按预期更新“X”.“ORDER_PRODUCT”表中的“PROPERTY_VALUE”。

相关问题