回答

收藏

在Oracle SQL中进行MERGE时,如何更新SOURCE中不匹配的行?

技术问答 技术问答 278 人阅读 | 0 人回复 | 2023-09-14

我有一个main数据库和一个report数据库,我需要将表从同步main到report。# J3 m/ R" b8 k& o1 F) v+ g
但是,当某项在main数据库中删除时,我只想IsDeleted在report数据库中设置一个标志。1 e* m8 ~! a6 F% \( |5 u
有什么优雅的方法可以做到这一点?
; X( B$ u# O5 r! w* J# p4 w( r$ Z$ ~我目前正在使用MERGE语句,如下所示:
8 \/ N2 n7 j7 m1 w$ K, eMERGE INTO report.TEST target. C2 q1 R. ~& z/ _) \3 |
USING (SELECT * FROM main.TEST) source9 v+ a# S- o( B
   ON (target.ID = source.ID)$ X! S6 ^& H% }4 X! o) J9 M
WHEN MATCHED THEN/ r. _" A% C1 ?
    UPDATE SET (target... = source...)& L8 [5 \6 |% O% S: o
WHEN NOT MATCHED THEN
# W2 X" C4 q9 ~) w. O    INSERT (...) VALUES (source...)
  Z: M5 j9 j( v* j$ L" Y;+ r% Z0 Q- Y+ P! m: q# K; q% R
该WHEN NOT MATCHED语句为我提供了来自的所有新值main,但我也想更新来自的所有旧值report。
  \9 N7 a2 ]& [( u9 T我正在使用Oracle PL / SQL。
) `# h6 [! x9 c' N1 h; X7 i8 ]               
) @8 u/ P5 D  }  i9 M( I解决方案:
" U# d4 I+ z7 G6 H               
1 ]1 h  u5 s- m0 g" g: A/ T* N! Z
$ V1 v6 y0 ^0 }/ |. c# k6 h
                您可以使用单独的UPDATE语句来完成此操作) s, Q: p$ i0 y: x! u  {
UPDATE report.TEST target+ ~" k  T9 e8 E% D* N# T
SET    is Deleted = 'Y'
" p& T9 [3 }; h; ?( b9 QWHERE  NOT EXISTS (SELECT 13 G1 J; h) \% b* ?5 i& C8 f$ r( C
                   FROM   main.TEST source2 z+ h! M3 n/ f5 j' n7 y8 e* h
                   WHERE  source.ID = target.ID);
' d0 c7 D/ p5 \我不知道有什么方法可以将其集成到您的MERGE语句中。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则