合并两个表

Bel*_*igh 1 sql-server t-sql sql-server-2008-r2 merge

SQL Server 2008 R2我有一个名为的主表Employees,其中包含大约 20 个字段。我有第二个电子表格,其中包含除 5 之外的所有字段UpdateToEmployees,我需要合并这些字段,Employees但仅在值不相同的地方。

执行此操作的最有效方法是什么?我的思考过程(可能很长)是:

  1. 运行 ASelect语句以获取值不相同的行
  2. 获取该结果集并插入到临时表中exists,用是/否值标记一个字段
  3. 如果该字段exists包含 yes 值 - 运行更新查询
  4. 如果该字段不exists包含值 - 运行插入查询

使用下面的 DDL - 我如何加入 empID 并更新记录 where when matched= Yes 或 True(无论它返回的是什么)并插入当前不存在的记录Employees

Create Table Employees
(
  empid varchar(50)
  ,empaddress varchar(500)
  ,phone varchar(12)
  ,emcontact1 varchar(500)
  ,emcontact2 varchar(500)
  ,active varchar(10)
  ,manager varchar(50)
  ,paygrade int
)

Insert Into Employees (empid,empaddress,phone,emcontact1, emcontact2, active, manager, paygrade) VALUES
('aa11', '123 blue', '1234567890', 'A A', 'B B', 'Yes', 'Manager 1', 1)
,('bb22', '123 green', '4567890000', 'B B', 'A A', 'Yes', 'Manager 2', 1)
,('cc33', '123 red', '789123456', 'E E', 'R R', 'Yes', 'Manager 3', 2)

Create Table UpdateToEmployees
(
  empid varchar(50)
  ,empaddress varchar(500)
  ,phone varchar(12)
)

Insert Into UpdateToEmployees (empid, empaddress, phone) VALUES
('aa11', '611 pink', '9999999999')
,('cc33', '212 orange', '0000000000')
,('ee99', '1411 red', '4444444444')
,('zz22', '2212 fox', '5555555555')
,('tt83', '1999 prince', '7777777777')
Run Code Online (Sandbox Code Playgroud)

use*_*140 5

未经测试,
因为我目前无法访问 SQL Server,但是试试这个,它应该可以工作,或者至少为您指明正确的Merge语句语法方向

MERGE Employees emp
USING UpdateToEmployees ute
ON [emp].[empid] = [ute].[empid]
WHEN MATCHED THEN
  UPDATE
  SET [emp].[empaddress] = [ute].[empaddress]
  ,[emp].[phone] = [ute].[phone]
WHEN NOT MATCHED BY TARGET THEN
INSERT (empid, empaddress, phone)
VALUES ([ute].[empid], [ute].[empaddress], [ute].[phone]);
Run Code Online (Sandbox Code Playgroud)