|
我在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,'') |
|