2016-06-28 14 views
0

Iは、以下の表を持っている場合:ActIDはのParentIDに基づいて、連続番号である再計算サブクエリ

CREATE TABLE Acts (ParentID int, ActID int, Text nvarchar(255)) 
--------------------- 
1 | 1 | "Hello" 
1 | 2 | "Hello again" 
2 | 1 | "lol" 
2 | 2 | "rofl" 

。 と私は次のように行のサブセットごとに新しい行を挿入する必要があります:私は、私が欲しい

1 | 1 | "Hello" 
1 | 2 | "Hello again" 
1 | 3 | "Hello" 
1 | 3 | "Hello again" 
... 

を得た

INSERT INTO Acts 
SELECT ParentID, (SELECT MAX(ActID) + 1 FROM Acts), Text FROM Acts WHERE Text LIKE 'Hello%' 

1 | 1 | "Hello" 
1 | 2 | "Hello again" 
1 | 3 | "Hello" 
1 | 4 | "Hello again" 

私はすぐにサブクエリがあることに気づきましたINSERTが実行される前に評価されるだけなので、常に同じ最大値を返します。結果を1つずつ挿入してサブクエリを更新するか、サブクエリを各行の後に更新する必要があることを指定する方法はありますか?

+0

あなたは「(...)法のINSERT INTO VALUES(...)」を意味するか、時間 –

+0

にエントリを作成するために選択を変えることができますか?しかし、私はクエリの各結果の行を挿入する必要があります。 –

+0

はい、カーソルを使用して行ごとにlastID +1を挿入することができます。 – Jesus

答えて

3

これを試してみると、最大ActIDが得られ、それにseqの1,2,3が追加されます。

INSERT INTO Acts 
SELECT ac.ParentID, (SELECT MAX(ac1.ActID) FROM Acts ac1 WHERE ac1.ParentID = ac.ParentID) + ROW_NUMBER() OVER(partition by ac.ParentID order by ac.ParentID), Text 
FROM Acts ac 
WHERE ac.Text LIKE 'Hello%' 
+0

はい! ActIDは挿入された行ごとにインクリメントされます。いい答えだ。 – Jesus

+1

これは華麗ですが、今のように私が欲しいものを正確にはしません。私はいくつかの小さな編集をする必要があった。サブクエリのWHERE句が、現在のParentIDの最大ActIDのみを使用するように、 '...(SELECT MAX(ActID)FROM Acts WHERE ParentID = outerActs.ParentID)... 'のように必要でした。 –

+0

行番号が現在のParentIDによってグループ化されていることを確認するには、上記のWHERE句に加えて、 'row_number()over(ParentID by ParentID order by ParentID)'も使用する必要があります。 (私はそのように答えを編集することが許されているかどうか分からないので、私はただコメントしました) –