回答

收藏

合并-仅在值更改时更新

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

我在SQL Server中运行合并。在我的更新中,我只想更新值已更改的行。版本行在每次更新时都会递增。下面是一个示例:7 B  I" u; s) b& K+ @, n& G
MERGE Employee as tgt USING 4 k( X/ {: ]; Z- A' A
(SELECT Employee_History.Emp_ID
) m5 A- I- Q2 ~7 d" s, Employee_History.First_Name
+ `( R1 [) ~2 n! N" S, S% W, Employee_History.Last_Name0 V6 ^( O. t9 z. o5 q
FROM Employee_History)& ]9 y0 t9 q& [5 `) |, g$ \
as src (Emp_ID,First_Name,Last_Name)
6 E- [3 n9 h0 l0 l9 A! AON tgt.Emp_ID = src.Emp_ID; f1 G! {% h1 W: F
WHEN MATCHED THEN 0 r) \4 K8 t: [& ?' f7 J
    UPDATE SET
; b9 V: P# A' b* h. _/ ?* o  _, @    Emp_ID = src.Emp_ID,  w, i: R- F$ Y
    ,[VERSION] = tgt.VERSION + 1
* M. S0 z$ x/ ^( |    ,First_Name = src.First_Name
$ _+ _2 i9 R1 H" i8 K    ,Last_Name = src.Last_Name
- N! E* |" G2 U  r1 F6 ^$ v' ^  I  LWHEN NOT MATCHED BY target THEN
7 Y7 q; j' r6 g+ [( b0 S    INSERT (Emp_ID,0,First_Name,Last_Name)
7 M# b! l/ N, D: Y2 i8 fVALUES
+ t+ \2 p$ M/ f6 N" a    (src.Emp_ID,[VERSION],src.First_Name,src.Last_Name);
- Q6 n' j: M3 K5 a$ U: q. v8 }现在,如果我只想更新行,从而增加版本,则仅在名称更改的情况下。2 S" T4 t' C; Z& J- l/ B
               
6 `0 K4 n$ H! }5 |4 c" [  I解决方案:5 [- [% W* g% x( e
               
+ Q. w7 m% I) Y4 ]' V! z7 D6 J+ c/ g5 B  s! H  S6 T

) G4 Z/ b# {$ s/ D! s                WHEN MATCHED可以有AND。另外,无需更新EMP_ID。
" y* F0 K$ H2 x0 Z* f) ^$ ?- k: J...
/ J+ g6 }" `0 t- i: w& d2 u WHEN MATCHED AND (trg.First_Name  src.First_Name
; b9 `* _" V- |* Q' q, Q   OR trg.Last_Name  src.Last_Name) THEN UPDATE
$ O9 r5 U& ^  W+ N. V   SET 6 J+ `% t/ e8 m; r& Z8 I& u# q7 W
   [VERSION] = tgt.VERSION + 1
8 {2 r1 }8 q) ~9 R+ o- C. o    ,First_Name = src.First_Name6 a+ ]; X1 H6 J& V2 F+ U0 J
    ,Last_Name = src.Last_Name
& @! X( r) H7 j( |) Y; W0 _0 _ ...% i1 a2 o8 e# j2 u: `: j6 n
如果Last_Name或First_Name可为空,NULL则例如在比较trg.Last_Name 9 o  y6 l9 B" a: K( J) q' y
src.Last_Name时,需要注意值。ISNULL(trg.Last_Name,'')  ISNULL(src.Last_Name,'')
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则