SQL Server 2008 R2
約20のフィールドを保持するEmployees
というマスターテーブルがあります。 UpdateToEmployees
とマージする必要があるEmployees
と呼ばれる5を除くすべてのフィールドを含む2番目のスプレッドシートがありますが、値が同じでない場合のみです。
これを行う最も効率的な方法は何ですか?私の思考プロセス(長い道のりかもしれません)は次のとおりです。
Select
ステートメントを実行して、値が異なる行を取得しますexists
にyes/no値のフラグを立てて一時テーブルに挿入しますexists
にyesの値が含まれている場合-更新クエリを実行します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]);
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/ は、私の大まかな検索から最初に出てきたものです)。