在實際項目開發過程中,經常有合并數據的需求。這里合并數據的意思是,對于源表A,目標表B,如果A中存在B中不存在則插入記錄,如果A中存在B中也存在則更新記錄,如果A中不存在B中存在則刪除記錄。
為了實現這一需求,我們有兩種解決方案,一是傳統的處理方法,即使用EXISTS謂詞,更新和新增分開處理的方式。另一種是使用MERGE語句(SQL Server 2008中新增的功能)。為了演示這一功能,首先我們需要準備測試數據,我們在tempdb臨時數據庫中新建兩個表,源表Customers和目標表Customersstage,然后向這兩個表中插入測試數據,如下代碼。
USE tempdb;GO-- 合并數據-- 對于源表A,目標表B,如果A中存在B中不存在則插入記錄,如果A中存在B中也存在則更新記錄,如果A中不存在B中存在則刪除記錄。-- 準備測試數據IF OBJECT_ID('dbo.Customers','U') IS NOT NULL DROP TABLE dbo.Customers;GOCREATE TABLE dbo.Customers( custid INT NOT NULL, companyname NVARCHAR(30) NOT NULL, phone VARCHAR(30) NOT NULL, ADDRESS NVARCHAR(50) NOT NULL, CONSTRAINT PK_Customers PRIMARY KEY(custid) );INSERT INTO dbo.Customers ( custid, companyname, phone, ADDRESS )VALUES (1,N'cust 1','(111)111-111',N'address 1'), (2,N'cust 2','(222)222-222',N'address 2'), (3,N'cust 3','(333)333-333',N'address 3'), (4,N'cust 4','(444)444-444',N'address 4'), (5,N'cust 5','(555)555-555',N'address 5'); IF OBJECT_ID('dbo.CustomersStage','U') IS NOT NULL DROP TABLE dbo.CustomersStage;GOCREATE TABLE dbo.CustomersStage( custid INT NOT NULL, companyname NVARCHAR(30) NOT NULL, phone VARCHAR(30) NOT NULL, ADDRESS NVARCHAR(50) NOT NULL, CONSTRAINT PK_CustomersStage PRIMARY KEY(custid) );INSERT INTO dbo.CustomersStage ( custid, companyname, phone, ADDRESS )VALUES (2,N'AAAAA','(222)222-222',N'address 2'), (3,N'cust 3','(333)333-333',N'address 3'), (5,N'BBBBB','CCCCC',N'DDDDD'), (6,N'cust 6(new)','(666)666-666',N'address 6'), (7,N'cust 7(new)','(777)777-777',N'address 7');
運行以下代碼查看示例數據效果。
SELECT * FROM dbo.Customers;SELECT * FROM dbo.CustomersStage;
查詢結果如下。
新聞熱點
疑難解答