[SQL Server]「UPDATE ~ FROM」を使って一括でデータを更新しよう。

inno
2014-02-22 18:20 9008 0
UPDATE ~ FROM句について説明したいと思います。
「UPDATE ~ FROM」を使うとUPDATEを一括で処理することができます。
説明すると長くなるので、早速例文を見ましょう。

例文を簡単に説明すると。。。



「dbo.TempData」テーブルのデータの中でIdxカラムの値が「1,4,5」のデータのStrNameカラムの内容を修正する。という例文です。
まず、テストの為にテーブルを作成とデータを登録してみましょう。

-- #### テーブル作成
CREATE TABLE dbo.TempData
(
Idx int
, StrName varchar(50)
)
GO

-- #### データ登録
INSERT INTO dbo.TempData (Idx, StrName) VALUES (1, 'Z')
INSERT INTO dbo.TempData (Idx, StrName) VALUES (2, 'B')
INSERT INTO dbo.TempData (Idx, StrName) VALUES (3, 'C')
INSERT INTO dbo.TempData (Idx, StrName) VALUES (4, 'Y')
INSERT INTO dbo.TempData (Idx, StrName) VALUES (5, 'W')
INSERT INTO dbo.TempData (Idx, StrName) VALUES (6, 'F')
GO

-- #### データ確認
SELECT * FROM dbo.TempData


データ確認結果


上記の「修正前」のイメージと同じくデータが登録できました。
では、「修正後」のように修正してみましょう。

将来なら下記のようにします。

UPDATE dbo.TempData SET StrName = 'A' WHERE Idx = 1
UPDATE dbo.TempData SET StrName = 'D' WHERE Idx = 4
UPDATE dbo.TempData SET StrName = 'E' WHERE Idx = 5

ですが、データが多い場合はこの方式は処理速度も遅いし非効率的です。
一括で更新する時は下記のように作成します。

UPDATE dbo.TempData
SET StrName = B.StrName
FROM dbo.TempData AS A
JOIN 
(
SELECT 1 Idx, 'A' StrName UNION ALL
SELECT 4 Idx, 'D' StrName UNION ALL
SELECT 5 Idx, 'E' StrName
) AS B
ON A.Idx = B.Idx

これを実行するとイメージの「修正後」のようにデータが一括で修正されます。
この方法は意外と良く使われますので、覚えて置いた方がいいです。

 実行結果


ふ~~~ん。。理解が良くできません!!!!!
では、もう一つの例文を見ましょう。

使用されるテーブルは「dbo.TempUser」、「dbo.TempResult」です。

「dbo.TempUser」には会員情報があります。
「dbo.TempResult」には会員情報を抽出したいデータがあります。


まず、テストの為にテーブルとデータを登録しましょう。

-- #### テーブル作成
CREATE TABLE dbo.TempUser
(
Idx int
, StrName varchar(50)
, MailAddr varchar(100)
)
GO

-- #### データ登録
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (1, 'A', 'A@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (2, 'B', 'B@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (3, 'C', 'C@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (4, 'D', 'D@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (5, 'E', 'E@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (6, 'F', 'F@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (7, 'G', 'G@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (8, 'H', 'H@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (9, 'I', 'I@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (10, 'J', 'J@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (11, 'K', 'K@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (12, 'L', 'L@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (13, 'M', 'M@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (14, 'N', 'N@a.com')
INSERT INTO dbo.TempUser (Idx, StrName, MailAddr) VALUES (15, 'O', 'O@a.com')
GO

-- #### データ確認
SELECT * FROM dbo.TempUser

データ確認結果



では、抽出結果を保存するテーブルを作成しましょう。

-- #### テーブル作成
CREATE TABLE dbo.TempResult
(
Idx int
, StrName varchar(50)
, MailAddr varchar(100)
)
GO

-- #### データ登録
INSERT INTO dbo.TempResult (Idx) VALUES (1)
INSERT INTO dbo.TempResult (Idx) VALUES (2)
INSERT INTO dbo.TempResult (Idx) VALUES (3)
INSERT INTO dbo.TempResult (Idx) VALUES (7)
INSERT INTO dbo.TempResult (Idx) VALUES (9)
INSERT INTO dbo.TempResult (Idx) VALUES (10)
INSERT INTO dbo.TempResult (Idx) VALUES (12)
INSERT INTO dbo.TempResult (Idx) VALUES (13)
INSERT INTO dbo.TempResult (Idx) VALUES (15)
GO

-- #### データ確認
SELECT * FROM dbo.TempResult

データ確認結果


では、「dbo.TempUser」データを元に「dbo.TempResult」にIdxと一致するデータを抽出及び更新してみましょう。

UPDATE dbo.TempResult
SET StrName = B.StrName
, MailAddr = B.MailAddr
FROM dbo.TempResult AS A
JOIN dbo.TempUser AS B
ON A.Idx = B.Idx

これで「dbo.TempResult」に一括でデータの更新作業が終わりました。
データを確認してみましょう。

SELECT * FROM dbo.TempResult

実行結果


コメント