;with A as ( select 'A' Id union all select 'B' union all select 'C' union all select 'D' ) , B as ( select 'A' Id union all select 'B' union all select 'C' union all select 'D' union all select 'E' union all select 'F' ) select Id from A except select Id from B
;with A as ( select 'A' Id union all select 'B' union all select 'C' union all select 'D' ) , B as ( select 'A' Id union all select 'B' union all select 'C' union all select 'D' union all select 'E' union all select 'F' ) select Id from B except select Id from A
Id ---- E F
(2 rows affected)
知道特性後就可以來修正 ef 上面遇到的問題 , 情境大概是這樣 , 要從 Oracle 原始資料運用排程把資料倒進去 sql server 裡
MERGE Doc AS T USING #DocSource AS S ON T.DocId = S.DocId WHEN MATCHED THEN UPDATE SET T.Item1 = S.Item1 , T.ModifyDatetime = S.ModifyDatetime , T.SysUpdateDatetime = S.SysUpdateDatetime WHEN NOT MATCHED BY TARGET THEN INSERT (Item1 , ModifyDatetime , SysUpdateDatetime) VALUES (S.Item1 , S.ModifyDatetime , S.SysUpdateDatetime) WHEN NOT MATCHED BY SOURCE THEN DELETE;
另外還可以這樣用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
INSERT INTO DocTest(S.Item1 , S.ModifyDatetime , S.SysUpdateDatetime) SELECT Item1 , ModifyDatetime , SysUpdateDatetime FROM ( MERGE Doc AS T USING #DocSource AS S ON T.DocId = S.DocId WHEN MATCHED THEN UPDATE SET T.Item1 = S.Item1 , T.ModifyDatetime = S.ModifyDatetime , T.SysUpdateDatetime = S.SysUpdateDatetime WHEN NOT MATCHED BY TARGET THEN INSERT (Item1 , ModifyDatetime , SysUpdateDatetime) VALUES (S.Item1 , S.ModifyDatetime , S.SysUpdateDatetime) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action , Inserted.Item1 , Inserted.ModifyDatetime , SysUpdateDatetime.DocId ) AS Changes (Action , Item1 , ModifyDatetime , DocId) WHERE Action = 'INSERT'
DECLARE @DocTest TABLE ( MergeAction varchar(50), Item1 varchar(30) not null, ModifyDatetime datetime null, SysUpdateDatetime datetime not null );
MERGE Doc AS T USING #DocSource AS S ON T.DocId = S.DocId WHEN MATCHED THEN UPDATE SET T.Item1 = S.Item1 , T.ModifyDatetime = S.ModifyDatetime , T.SysUpdateDatetime = S.SysUpdateDatetime WHEN NOT MATCHED BY TARGET THEN INSERT (Item1 , ModifyDatetime , SysUpdateDatetime) VALUES (S.Item1 , S.ModifyDatetime , S.SysUpdateDatetime) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action as MergeAction, CASE $action WHEN 'DELETE' THEN deleted.Item1 ELSE inserted.Item1 END AS Item1, CASE $action WHEN 'DELETE' THEN deleted.ModifyDatetime ELSE inserted.ModifyDatetime END AS ModifyDatetime, CASE $action WHEN 'DELETE' THEN deleted.SysUpdateDatetime ELSE inserted.DocId END AS SysUpdateDatetime INTO @DocTest;