首页 > 开发 > 综合 > 正文

合并数据

2024-07-21 02:48:52
字体:
来源:转载
供稿:网友
合并数据

  在实际项目开发过程中,经常有合并数据的需求。这里合并数据的意思是,对于源表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;

查询结果如下。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表