2

以下のコードは完全に機能していますが、長すぎると感じます。フィールド「MealNo」の値「1」を削除してから、フィールド MealNo=2 を持つ行にレコードを移動したいのです。

以下のコードは仕事をしますが、非常に長く見えます。短縮する方法はありますか? 特に「どこで」の後

 if ((SELECT MealNo FROM [Temp_Food_TBL] WHERE [AutoNo] = @AutoNo) = 1)
    BEGIN 
        Update [Temp_Food_TBL]
        SET
         MealNo = 1
         Where
         MealNo = 2
         AND
         PersonID = (SELECT PersonID FROM [Temp_Food_TBL] WHERE [AutoNo] = @AutoNo)
         AND
         MealTime = (SELECT MealTime FROM [Temp_Food_TBL] WHERE [AutoNo] = @AutoNo)
         AND
         MealDate = (SELECT MealDate FROM [Temp_Food_TBL] WHERE [AutoNo] = @AutoNo)  
    END

 DELETE FROM [Temp_Food_TBL]
   WHERE 
 [AutoNo] = @AutoNo
4

2 に答える 2

2

WHEREステートメントを使用する代わりに、自己結合を試すことができます。

if ((SELECT MealNo FROM [Temp_Food_TBL] WHERE [AutoNo] = @AutoNo) = 1)
    BEGIN 
        UPDATE t1
        SET t1.MealNo = 1
        FROM [Temp_Food_TBL] AS t1
        INNER JOIN [Temp_Food_TBL] AS t2
          ON t1.PersonID = t2.PersonID
            AND t1.MealTime = t2.MealTime
            AND t1.MealDate = t2.MealDate
            AND t1.MealNo = 2 
        WHERE t2.AutoNo = @AutoNo 
    END 

   DELETE FROM [Temp_Food_TBL]
   WHERE [AutoNo] = @AutoNo

それは本当に根本的に短いわけではありません。しかし、一致する行を見つけるためのいくつかの基準があるため、それをそれほど短縮できるかどうかはわかりません。

于 2013-04-02T13:12:53.597 に答える
1
;WITH DATA AS
(
      SELECT
            Temp_Food_TBL.*
      FROM
            Temp_Food_TBL
            INNER JOIN Temp_Food_TBL AS Match
                  ON Temp_Food_TBL.PersonID = Match.PersonID
                  AND Temp_Food_TBL.MealTime = Match.MealTime
                  AND Temp_Food_TBL.MealDate = Match.MealDate
                  AND Match.AutoNo = @AutoNo
                  AND Match.MealNo = 1
)
UPDATE DATA SET MealNo = 2

DELETE FROM Temp_Food_TBL WHERE AutoNo = @AutoNo
于 2013-04-02T13:16:40.647 に答える