2011-11-11 12 views
2

は、テーブルAに、テーブルBからのレコードの下に挿入しながら、ランク列valusが同じレコードインサート場合インクリメント保つなければならないSQLServerのランニングカウント

col1 col2 col3 rank 
1  2 n 5 
1  2 n 6 
2  3 a 3 

として以下の表を想像します。上記のレコードが挿入された後、Aに挿入つもりテーブルBで

レコードはテーブルAの所望の出力

col1 col2 col3 
1  2 n 
2  3 a 

あり、これをacheiveする方法を、私を助けてください、

col1 col2 col3 rank 
    1 2 n 5 
    1 2 n 6 
    1 2 n 7 
    2 3 a 3 
    2 3 a 4 

です。ありがとう。

答えて

2

Bのレコードが一意である場合、あなたはこの

のようなクエリを使用することができますが-------------- EDIT --------- ----------

Bは、複数のレコードを持つことができる場合は、パーティション

insert into TestA 
select b.*, 
(select max([rank]) from TestA where col1 = b.col1 and col2 = b.col2 and col3 = b.col3) 
+ row_number()over (partition by col1, col2, col3 order by col1, col2,col3 asc) as N 
from TestB b 

でROW_NUMBER()funcionを使用することができます------------- - 終了編集 -------------------

注:私は、テーブルの名前を変更:種皮とTESTB

insert into TestA 
select b.*, (select max([rank])+1 from TestAwhere col1 = b.col1 and col2 = b.col2 and col3 = b.col3) 
from TestB b 

またはこの

のように登録しよう
insert into testa 
select b.*, mr+1 from TestB b 
join 
(select col1, col2, col3, max([rank]) as mr 
from TestA A 
group by col1, col2, col3) as M 
on 
b.col1 = M.col1 and b.col2 = M.col2 and b.col3 =M.col3 
+0

こんにちは、ありがとうございました。最初のコードは実行できません。なぜなら、実行カラムはテーブルbには存在しないからです。私は2番目を試しました。この問題は、テーブルBに第1行と同じ行が重複している場合、第2エントリにも同じランクが割り当てられていることになります。インクリメントする必要があります。 –

+0

テーブルBの複数のエントリで動作するようにクエリを変更しました –

+0

Genius man ... :)素晴らしい...変更されたコードが期待通りに機能しました.. –

2

では、私はこのためINSTEAD OFINSERTtriggerを使用します。このように:

CREATE TRIGGER rankInsertTrigger 
ON A 
INSTEAD OF INSERT 
AS 
BEGIN 
    INSERT INTO A(col1, col2, col3, rank) 
    SELECT i.col1, i.col2, i.col3, 
      MAX(SELECT a.rank 
       FROM A AS a 
       WHERE a.col1 = i.col1 
       AND a.col2 = i.col2 
       AND a.col3 = i.col3) + 1 
    FROM inserted i 
END 

たび、あなたは今、テーブルAに値を挿入、このトリガーを実行して、必要なrankを設定し、挿入して、オリジナルのインサートを置き換えます。あなたがINSERT INTO A(col1, col2, col3) VALUES (1, 2, n)を行う際

例えば、どのような実際に実行して(、col1の元の値をとり、col2col3しかしrankを上書き)トリガでのinsert文です。

+0

トリガー内の検索する約句?それは私が変更するのに役立つでしょう。ウルの助けをありがとう。 –

+1

これは並行挿入を処理するようには見えません。 –

+0

@Robin INSERTトリガーの内部には、挿入されたレコードを表す 'inserted'というテーブルがあります。 selectステートメントは、 'inserted'テーブルからデータを選択し、次の' rank'を決定し、このデータを使用して 'A'テーブルに挿入します。 –