20K行程度を一度に移行してください。 SQLから10年以上離れていて、苦労しています。SQL Serverのストアドプロシージャ:最小値のUPDATE、値が既にある場合はINSERT
私はこれについて完全に間違っているかもしれません。既にValue2
がある場合を除き、Table2.Value1
の最低値でTable1.Value2
を更新する必要があります。後者の場合、その値を持つ行をTable1.Value1
として挿入する必要があります。
Table1.Value1
は、行の各IDの最小値です。 Value2
は次に低い必要があります。
現在表1:
ID1, 123, [empty]
ID4, 111, [empty]
現在表2:
ID1, 224
ID1, 331
ID4, 210
ID4, 551
表1 - 所望の状態:
ID1, 123, 224
ID1, 331, [empty]
ID4, 111, 210
ID4, 551, [empty]
表2 - 所望の状態:
[empty]
これは私が試したことであり、更新セクションは正しく動作します。挿入物は決して働かない。私はコーナーに自分自身をコーディングしたと思う。
CREATE PROCEDURE dbo.Broken
AS
--DECLARE VARIABLES
DECLARE @ID INT,
@Value1 INT,
@Value2 INT,
@tmpValue INT
--DECLARE COUNTER
DECLARE @Counter INT
SET @Counter = 1
--DECLARE CURSOR FOR QUERY
DECLARE cTable1 CURSOR READ_ONLY FOR
SELECT ID,Value1, Value2
FROM Table1
OPEN cTable1
--FETCH VARIABLES
FETCH NEXT FROM cTable1 INTO @ID, @Value1, @Value2
--LOOP
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@Value2 = '' OR @Value2 is NULL)
BEGIN
--UPDATE Table1.Value2 with next lowest Table1.Value2 > Table1.Value1
SET @tmpValue = (SELECT MIN(Value1) FROM Table2 WHERE Value1 > @Value1 AND ID = @ID)
UPDATE Table1
SET Value2 = @tmpValue
WHERE ID = @ID
--DELETE AFFECTED ROW FROM Table2
DELETE FROM Table2
WHERE Value1 = @tmpValue AND ID = @ID;
END
ELSE
BEGIN
--INSERT ROW IN Table1 WITH ID, Value1 FROM Table2
SET @ID = (SELECT MIN(ID) FROM Table2)
SET @tmpValue = (SELECT MIN(Value1) FROM Table2 WHERE ID = @ID)
INSERT INTO Table1(ID, Value1, Value2)
VALUES (@ID, @tmpValue, '')
DELETE FROM Table2
WHERE ID = @ID
END
--FETCH NEXT VARIABLES
FETCH NEXT FROM cTable1 INTO @ID, @Value1, @Value2
END
--CLOSE THE CURSOR TABLE
CLOSE cTable1
DEALLOCATE cTable1
約2万行があるので、ストアドプロシージャがすべてを達成することを望んでいます。それは一回限りだから、オーバーヘッドについて懸念しているスーパーではない。
それでは 'ID1、111'と' Table2'内の別の行がありますか? 「ID1,444」はどうですか?これらのケースで最終的な結果はどうなるでしょうか? 1つのテーブルに結果を構築するには、 'MIN(Value)GROUP BY ID'、' UNION'、 'ROW_NUMBER()'、 'CROSS APPLY'が便利です。トランザクションで 'INSERT INTO'、' MERGE'または別々の 'INSERT' /' UPDATE'文のどちらかを使って、 'Table1'をその結果のようにすることができます(そして、' Table2'は単純にその行をすべて削除することができます)。 10年後にSQLを使用していないのであれば、カーソルが存在することをまだ思い出しているのは残念です。:-P –
目的を達成するためにストアドプロシージャは必須ですか?これは、CASE文とINSERT INTO – Isaiah3015
@ JeroenMostertで一時テーブルにテーブルをつかんで簡単に行うことができます。私はMERGEを検討する必要がありますが、私はそれを達成する別の方法として考えていました。 – Zebrahead