在实际项目开发过程中,经常有合并数据的需求。这里合并数据的意思是,对于源表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;
查询结果如下。
新闻热点
疑难解答