SQL Server MERGE(表跟表的結合)
以下例子可以說明MERGE用處
假設2表
一個是主要的總表 1 2 3 4 5 6 7 共7筆資料
另一表為要加入的新表 1 2 3 8 9 共5筆資料
其中,重複的要做更新,而新的資料要加進總表
這時一筆筆比對,一筆筆加入更新,頗累的
MARGE用途就在這裡
可以想像成總公司的資料
要結合子公司傳來的的資料
就可能會出現這個問題
老師還說個例子,選課系統
說明 WHEN NOT MATCHED 中的
BY TARGET 跟
BY SOURCE 的差別
假設上學期選課的有 2、4、5、7、10號同學
下學期同課程新的名單有 2、3、4、5、11號同學
2、4 、5號同學要更新 (WHEN MATCHED)
3、11號同學要新增 (WHEN NOT MATCHED BY SOURDE )
7、10號同學則刪除 (WHEN NOT MATCHED BY TARGET )
假設2表
一個是主要的總表 1 2 3 4 5 6 7 共7筆資料
另一表為要加入的新表 1 2 3 8 9 共5筆資料
其中,重複的要做更新,而新的資料要加進總表
這時一筆筆比對,一筆筆加入更新,頗累的
MARGE用途就在這裡
可以想像成總公司的資料
要結合子公司傳來的的資料
就可能會出現這個問題
老師還說個例子,選課系統
說明 WHEN NOT MATCHED 中的
BY TARGET 跟
BY SOURCE 的差別
假設上學期選課的有 2、4、5、7、10號同學
下學期同課程新的名單有 2、3、4、5、11號同學
2、4 、5號同學要更新 (WHEN MATCHED)
3、11號同學要新增 (WHEN NOT MATCHED BY SOURDE )
7、10號同學則刪除 (WHEN NOT MATCHED BY TARGET )
CREATE TABLE #客戶總表
(
客戶編號 CHAR(5), 姓名 NCHAR(5), 電話 CHAR(20),
地址 NCHAR(50), 異動時間 DATE
)
GO
CREATE TABLE #異動客戶
(
客戶編號 CHAR(5), 姓名 NCHAR(5), 電話 CHAR(20),
地址 NCHAR(50), 異動時間 DATE
)
GO
CREATE TABLE #同步客戶記錄
(
同步動作 CHAR(10), 同步時間 SMALLDATETIME,
客戶編號 CHAR(5), 舊姓名 NCHAR(5), 新姓名 NCHAR(5),
舊電話 CHAR(20), 新電話 CHAR(20), 舊地址 NCHAR(50),
新地址 NCHAR(50), 舊異動時間 DATE, 新異動時間 DATE
)
GO
TRUNCATE TABLE #客戶總表
INSERT INTO #客戶總表 VALUES
('A0001','王小明','03-3334444','桃園縣中壢市','2000-5-5'),
('B0104','李小英','02-22223333','台北市新莊市','2001-4-7'),
('A0013','林小雄','03-5556666','新竹縣竹北市','2002-7-4'),
('B0005','廖小美','04-24445555','台中市西屯區','2004-8-2'),
('A0015','ㄚ土伯','05-5556666','嘉義縣嘉義市','2004-8-2'),
('B0007','錢夫人','07-7778888','高雄市左營區','2004-8-2')
INSERT INTO #異動客戶 VALUES
('A0001','王大明','03-3225555','桃園縣平鎮市','2008-8-8'),
('B0104','李大英','02-22224444','台北市新店市','2008-4-7'),
('A0018','忍太郎','03-5558888','新竹縣新竹市','2007-7-8'),
('B0005','廖大美','04-24447777','台中市北屯區','2008-10-10'),
('A0025','撒隆巴斯','06-6667777','台南縣新營市','2007-8-2'),
('B0007','錢貴婦','07-7779999','高雄市旗津區','2006-12-31')
GO
SELECT * FROM #客戶總表
SELECT * FROM #異動客戶
SELECT * FROM #同步客戶記錄
MERGE #客戶總表 AS t
USING #異動客戶 AS s
ON s.客戶編號=t.客戶編號
--當比對相符則執行更新(這一定要加AND)
WHEN MATCHED AND s.異動時間>t.異動時間 THEN
UPDATE SET t.姓名=s.姓名,t.電話=s.電話,t.地址=s.地址,t.異動時間=s.異動時間
--當比對沒有相符時,則新增
--可以配合 BY TARGET 或是 BY SOURECE
WHEN NOT MATCHED THEN
INSERT (客戶編號,姓名,電話,地址,異動時間)
VALUES(s.客戶編號,s.姓名,s.電話,s.地址,s.異動時間)
--以下是紀錄,可加可不加,加了每筆動作都會紀錄到#同步客戶紀錄
--其中的$action是OUTPUT中針對MARGE的字句,會依當時的動作
--在欄位中寫入'UPDATE'、'DELETE'、'INSERT'
--若要使用,欄位格式要為CNAR(10)或以上
OUTPUT $action,GETDATE(),inserted.客戶編號,deleted.姓名,inserted.姓名,
deleted.電話,inserted.電話,deleted.地址,inserted.地址,
deleted.異動時間,inserted.異動時間
INTO #同步客戶記錄(同步動作, 同步時間, 客戶編號, 舊姓名,
新姓名, 舊電話, 新電話, 舊地址, 新地址, 舊異動時間, 新異動時間);
--整個MARGE會是一大段,要用分號結尾

留言
張貼留言