postgresql SQL错误-基于其他两个表更新第一个表中的列值

sqyvllje  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(138)

我有3个表OrderPaymentOrderSummaryInfoOrderLossEntity
OrderPayment表具有列OrdertypeCDOrderLossEntity表具有列OrderType
这三个表之间没有直接关系。
Ordersummary有一个主键orderevententity。此表是两个表(OrderPaymentOrderLossEntity)的主表。
OrderSummaryinfo表有一个名为orderNumber的列,OrderPayment表也有OrderNumber。这个OrderNumberOrderPayment表中的主键,引用OrderSummaryinfo

OrderSummaryInfo.OrderNumber = OrderPayment.OrderNumber

OrderSummaryinfo.orderevententityOrderLosseventEntity.id-->的主键,其中是OrderLosseventEntity表中引用OrderSummaryinfo.orderevententity的主键:

OrderSummaryinfo.orderevententity = OrderLossEntity.id

我的要求是OrderTypeCD有3个可能的值“现金”,“礼物”和“奖励”。
OrderType列有2个可能的值-"Direct"和"Indirect"。
如果OrderTypeCD的值为"Rewards",我应该将其更改为新值"CashBack",用于那些包含OrderType="Indirect"的订单。
我正在尝试查询,但收到错误

UPDATE Orderpayment op 
JOIN OrderSummaryInfo osi ON op.orderNumber = osi.OrderNumber 
JOIN OrderLossEntity ole ON ole.id = osi.orderevententity 
SET op.ordertypeCd = 'CashBck'  
WHERE op.orderTypeCD = 'Rewards' 
  AND ole.OrdeType = 'Indirect';

我得到一个错误
SQL状态:42601
请帮助我更正此查询。

ioekq8ef

ioekq8ef1#

你的第一个错误是从句的顺序。set子句必须紧跟着update,并且不能在set中使用表别名(参见documentation)。因此,您需要:

update OrderPayment  op 
   set OrderTypeCd = 'CashBck' ...

其次,from部分必须遵循标准SQL格式,因此update table_name set column_name join也将给予语法。为了完成必要的连接,你需要一个“子选择”。把这个和上面的内容沿着你的其他规定的要求一起,你会得到:

update OrderPayment  op 
   set OrderTypeCd = 'CashBck'  
  from (select  osi.OrderNumber 
        from OrderSummaryInfo osi
        join OrderLossEntity  ole 
          on ole.id = osi.OrderEventEntity
        where ole.OrderType = 'Indirect'
       ) jOrder
where op.OrderNumber = jOrder.OrderNumber
  and op.OrderTypeCd = 'Rewards';

**注:**未测试,未提供测试数据。

相关问题