一意の ID を持つテーブル項目があります: itemId, … 行の例: '3506', …</p>
次の列を持つテーブル ItemProperties があります: itemId、datecreated、datemodified、property1、property2、property3、property4、property5
行の例: '3506'、'2012…'、'2012…'、'prop1'、'prop2'、'prop3'、'prop4'、'prop5'</p>
ItemProperties テーブルのすべての行を、次の列を持つ NewItemProperties テーブルの 5 つの個別の行に分割する必要があります: itemId、datecreated、datemodified、propertynumber、property
5 行の例:
‘3506’, ‘2012…’, ‘2012…’, 1, ‘prop1’
‘3506’, ‘2012…’, ‘2012…’, 2, ‘prop2’
‘3506’, ‘2012…’, ‘2012…’, 3, ‘prop3’
‘3506’, ‘2012…’, ‘2012…’, 4, ‘prop4’
‘3506’, ‘2012…’, ‘2012…’, 5, ‘prop5’
制約: - Items テーブルに存在しない itemId を持つ ItemProperties は処理されません。
NewItems テーブルに既にある項目 (id =id および propertynumber=property1~5 列の番号) は、このプロセスによって上書き/更新されるべきではありません
Microsoft SQL Server 2008 R2
ItemProperties テーブルの約 800000 行
現時点で私が持っている非常に遅い解決策:
...
DECLARE c CURSOR read_only FOR SELECT * from ItemProperties
DECLARE @ID varchar(14), @CREA datetime, …
OPEN c
FETCH NEXT FROM c INTO @ID, @CREA, @MODI, @COL, @SIZE, @PAT, @YEAR, @ITEM
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
select * from Items where itemId = @ID
if @@ROWCOUNT = 0
BEGIN
GOTO Fetch_Next
END
select * from ItemProperties where itemId = @ID AND propertynumber = 1
if @@ROWCOUNT = 0
INSERT INTO NewItemProperties
VALUES(@ID, '1', @COL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
select * from ItemProperties where itemId = @ID AND propertynumber = 2
if @@ROWCOUNT = 0
INSERT INTO NewItemProperties
VALUES(@ID, '2', @SIZE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
…
END
Fetch_Next:
FETCH NEXT FROM c INTO @ID, @CREA, @MODI, @COL, @SIZE, @PAT, @YEAR, @ITEM
...
作成日と変更日を削除することで fetch ステートメントを最適化できますが、思いつくのはこれだけです。これをピボット解除クエリに適合させることができませんでした。基本的に、カーソルよりも速いものは何でも助けてくれます。すべてのアイデアを歓迎します。ありがとうございました。