Merge語法真的是一個很棒的語法,雖然寫起來個人認為是有點複雜,但是可以針對大批的資料做處理(insert、update、delete),雖然說我寫過if exists,但if exists比較針對單筆資料檢查,而像這種需要多筆資料同步異動時,Merge就是一個很棒的選擇。
Merge ScoreItem as Target
Using
(
Select a.CourseID,d.ItemNo,d.ItemName,d.ItemID,d.Rate
From Course a
join SchoolItem d
on a.Year=d.Year and a.Semester=d.Semester and a.DID=d.DID
where d.ItemID='AB1235'
)as Source
on Target.CourseID=Source.CourseIDand Target.ItemNo=Source.ItemNo
When Not Matched then
Insert
(
ItemID ,CourseID ,ItemName ,Rate
)
Values
(
NewID() ,Source.CourseID ,Source.ItemName ,Source.Rate
);
Merge ScoreItem as Target
Using
(
Select a.CourseID,d.ItemNo,d.ItemName,d.ItemID,d.Rate
From Course a
join SchoolItem d
on a.Year=d.Year and a.Semester=d.Semester and a.DID=d.DID
where d.ItemID='AB1235'
)as Source
on Target.CourseID=Source.CourseIDand Target.ItemNo=Source.ItemNo
When Not Matched then
Insert
(
ItemID ,CourseID ,ItemName ,Rate
)
Values
(
NewID() ,Source.CourseID ,Source.ItemName ,Source.Rate
);
這是我剛剛寫的SQL語法,大致上是這樣使用的
我想要去針對各課程的成績項目這張表做資料處理,只針對某個課程未有該成績項目(如期中考)的課程做資料處理,所以我先把要異動的表ScoreItem設為目標資料表,這邊的Target我記得是寫死的,一定得寫Target。
而至於資料來源Source就是我自己拼裝出來的SQL資料,這邊的Source可以自由命名,但我看網路上的範例都是寫目標及來源就沿用了。
然後他也會有一個on,這個on會影響待會要進行的行為,當Match的時候你可以做某些事,那像我這個需求是因為我要針對該張表缺少成績項目的資料新增,所以當課程ID相等及項目編號不相等時,我才做新增。
至於這邊比較特別的是,如果你是想針對Source搜尋不到的資料,但是還留在Target表的資料做刪除(通常是索引ID已經被消失的垃圾資料),你可以這麼寫
WHEN NOT MATCHED by Source
THEN delete;
這邊就是指說,以on為條件,但是是因為Target有資料而比對不到Source也有資料時,就刪除Target多出來的那筆資料,與上面例子的WHEN NOT MATCHED相較之下,就是on的判斷一個的基準不一樣,這麼說有點難懂,但實際上可以自己寫寫看,觀察資料的變化應該就可以理解了。
留言
張貼留言