2013-06-01 19 views
32

私はINSERT INTO SELECTクエリを持っています。 SELECTステートメントでは、フィールドに増分数値を追加するサブクエリがあります。 SELECTクエリが1つのレコードのみを返す場合、このクエリはうまく動作しますが、複数の行を返した場合、すべての行のインクリメンタルフィールドに同じ番号が挿入されます。 毎回増分値を追加する方法はありますか?SQL ServerのINSERT INTO SELECTクエリのフィールドに増分数値を追加します。

INSERT INTO PM_Ingrediants_Arrangements_Temp 
(AdminID,ArrangementID,IngrediantID,Sequence) 
(SELECT 
    @AdminID, @ArrangementID, PM_Ingrediants.ID, 
    (SELECT 
      MAX(ISNULL(sequence,0)) + 1 
     FROM 
      PM_Ingrediants_Arrangements_Temp 
     WHERE 
      [email protected]) 
FROM 
    PM_Ingrediants 
WHERE 
    PM_Ingrediants.ID IN (SELECT 
           ID 
          FROM 
           GetIDsTableFromIDsList(@IngrediantsIDs)) 
) 

答えて

54

これにはrow_number()関数を使用できます。

INSERT INTO PM_Ingrediants_Arrangements_Temp(AdminID, ArrangementID, IngrediantID, Sequence) 
    SELECT @AdminID, @ArrangementID, PM_Ingrediants.ID, 
      row_number() over (order by (select NULL)) 
    FROM PM_Ingrediants 
    WHERE PM_Ingrediants.ID IN (SELECT ID FROM GetIDsTableFromIDsList(@IngrediantsIDs) 
          ) 

あなたがテーブルにすでに最大で開始したい場合は、その後の操作を行います。

最後に
INSERT INTO PM_Ingrediants_Arrangements_Temp(AdminID, ArrangementID, IngrediantID, Sequence) 
    SELECT @AdminID, @ArrangementID, PM_Ingrediants.ID, 
      coalesce(const.maxs, 0) + row_number() over (order by (select NULL)) 
    FROM PM_Ingrediants cross join 
     (select max(sequence) as maxs from PM_Ingrediants_Arrangement_Temp) const 
    WHERE PM_Ingrediants.ID IN (SELECT ID FROM GetIDsTableFromIDsList(@IngrediantsIDs) 
          ) 

、あなただけsequence列自動インクリメントID列を作ることができます。これにより、毎回増分する必要がなくなります。

create table PM_Ingrediants_Arrangement_Temp (. . . 
    sequence int identity(1, 1) -- and might consider making this a primary key too 
    . . . 
) 
+0

第3のオプションでは、シーケンスフィールドの自動インクリメントを行う必要はありません。私はシーケンスから既存の番号を取得し、その列に次の増分番号を挿入する必要があります –

+0

Scnerio 2は私の状態で動作します。すぐに助けてくれてありがとう。 –

+0

::私のsquence列はnull値を許可せず、私のテーブルはレコードを持っていません。その例外を投げる.... –

関連する問題