web-dev-qa-db-ja.com

2つのテーブルをマージする

SQL Server 2008 R2約20のフィールドを保持するEmployeesというマスターテーブルがあります。 UpdateToEmployeesとマージする必要があるEmployeesと呼ばれる5を除くすべてのフィールドを含む2番目のスプレッドシートがありますが、値が同じでない場合のみです。

これを行う最も効率的な方法は何ですか?私の思考プロセス(長い道のりかもしれません)は次のとおりです。

  1. Selectステートメントを実行して、値が異なる行を取得します
  2. その結果セットを受け取り、フィールドexistsにyes/no値のフラグを立てて一時テーブルに挿入します
  3. フィールドexistsにyesの値が含まれている場合-更新クエリを実行します
  4. フィールドexistsに値がない場合-挿入クエリを実行します

以下のDDLを使用する-empIDに参加して、when matched =はいまたは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')

[〜#〜] unested [〜#〜]
現時点では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]);
5
user2676140

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/ は、私の大まかな検索から最初に出てきたものです)。

0
David Spillett