SQL ORACLE合并表

SQL ORACLE合并表,oracle,merge,Oracle,Merge,我想使用mergeupdate子句更新我的表MA_参与者。我想更新两列: MA_参与者。客户,MA_参与者。DEACT_FLG。CUSTOMER_RK将使用我的第二个table_CHANGE更新,该表由两列组成:- 顾客,新顾客。表MA_PARTICIPANT.DEACT_FLG中的MA_PARTICIPANT可能是“Y”或“N”,如果是“N”,则我应该将其更改为“Y”,但如果它已经是“Y”,则我不应该更新此列。合并表将在MA_PARTICIPANT.part_id=TABLE_CHANGE.p

我想使用mergeupdate子句更新我的表MA_参与者。我想更新两列:

MA_参与者。客户,MA_参与者。DEACT_FLG。CUSTOMER_RK将使用我的第二个table_CHANGE更新,该表由两列组成:-

顾客,新顾客。表MA_PARTICIPANT.DEACT_FLG中的MA_PARTICIPANT可能是“Y”或“N”,如果是“N”,则我应该将其更改为“Y”,但如果它已经是“Y”,则我不应该更新此列。合并表将在MA_PARTICIPANT.part_id=TABLE_CHANGE.part_id上,但我不知道如何在MA_PARTICIPANT.DEACT_FLG上使用带条件的合并

最后,我更新的每个客户都应该有flg='Y'

MA_参与者的简单示例:

PART_ID  CUSTOMER_RK  DEACT_FLG   
1          10          Y   
2          10          N   
3          20          Y
表_到_更改的简单示例:

PART_ID CUSTOMER_RK NEW_CUSTOMER_RK
1         10          100
2         10          100
3         20          200
更新后的MA_参与者:

PART_ID  CUSTOMER_RK  DEACT_FLG   
1          100          Y   
2          100          Y   
3          200          Y
我想会是:

merge INTO MA_PARTICIPANT P USING 
  (SELECT * from TABLE_TO_CHANGE) TT ON (TT.PART_ID = P.PART_ID)
WHEN matched THEN
  UPDATE    
  SET 
  IF P.DEACTIVATED_FLG <> 'Y' THEN
    P.CUSTOMER_RK = TT.NEW_CUSTOMER_RK,
    P.DEACTIVATED_FLG = 'Y'
  ELSE 
     P.CUSTOMER_RK = TT.NEW_CUSTOMER_RK

这将更新所有匹配行,将DEACT_FLG设置为Y,将CUSTOMER_RK设置为NEW_CUSTOMER_RK:


听起来您需要在merge语句的update部分使用where子句。如果我是你,我会先写合并语句并将其添加到问题中。我应该更新表中的每个值CUSTOMER RK,以根据表中的值进行更改和停用值\u FLG-如果值为'N',则我将其用作'Y',否则不更新。最后,我更新的每个客户都应该有flg='Y',如果是,我们不需要If,DECODE。。。;在MERGE中,对于每个匹配行,我们可以更新CUSTOMER\u RK=NEW\u CUSTOMER\u RK和DEACT\u FLG='Y'
MERGE INTO MA_PARTICIPANT P
USING TABLE_TO_CHANGE TT 
ON (TT.PART_ID = P.PART_ID)
WHEN matched THEN
  UPDATE    
  SET CUSTOMER_RK = NEW_CUSTOMER_RK,
      DEACT_FLG =   'Y'