Sql-Server

合併兩個表

  • October 5, 2016

SQL Server 2008 R2我有一個名為的主表Employees,其中包含大約 20 個欄位。我有第二個電子表格,其中包含除 5 之外的所有欄位UpdateToEmployees,我需要與之合併,Employees但僅在值不相同的地方。

最有效的方法是什麼?我的思考過程(可能是很長的路要走)是:

  1. 執行一條Select語句來獲取值不同的行
  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')

未經
測試,因為我目前無法訪問 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]);

自 SQL Server 2008 以來,該MERGE語句已經可用,這將更加高效,並且是一個手工製作的“檢查然後更新或插入”過程。請參閱https://msdn.microsoft.com/en-us/library/bb510625.aspx以供參考,儘管您可能會發現查找教程比從教程中工作更容易(http://www.made2mentor.com/2013 /05/writing-t-sql-merge-statements-the-right-way/是我粗略搜尋中出現的第一個)。

引用自:https://dba.stackexchange.com/questions/151475