2016-11-09 19 views
0

まず、SQLは私の強みではありません。私はそうのように、いくつかの種類によって、次の項目の数を追跡し一つのテーブルを持っている:SQL Serverは更新で2つのテーブルを増やす

declare @maxs as table 
(
    Equip int, 
    NextId int 
); 

-- initial id values 
insert into @maxs (Equip, NextId) values (400, 40); 
insert into @maxs (Equip, NextId) values (500, 50); 

私はタイプのアイテムを作成する場合は「400」は、次のIdが40であり、それがにインクリメントする必要があります41.単一の追加の場合、それは十分に簡単です。私たちのプログラムはバッチで追加するので、ここに私の問題があります。

declare @t as table (Id int, Equip int, Descr varchar(20)); 

-- simulates the batch processing 
insert into @t (Equip, Descr) values (400, 'Item 1'); 
insert into @t (Equip, Descr) values (400, 'Item 2'); 
insert into @t (Equip, Descr) values (500, 'Item 3'); 

-- generate the new id's in batch 
UPDATE t 
SET Id = (SELECT m.NextId + ROW_NUMBER() OVER (PARTITION BY t.Equip ORDER BY t.Equip)) 
FROM @t t 
INNER JOIN @maxs m ON m.Equip = t.Equip 

SELECT * FROM @t 

のみ1行が400に対して返さので、ROW_NUMBERの両方のために同じであるので、これは、両方のアイテム1と同一のIDを有する項目2になります。 @maxsのNextId値をインクリメントし、@tの中のエントリを更新して、@maxsの400値に結合する2番目の行が次の値を持つようにする必要があります(ほとんどC#のx ++参照に似ています) 。 SQLでそれを行うためのきれいな方法はありますか?

ありがとうございます。

+0

一時テーブルにテーブル変数から切り替えよう私の提案は、すべてのSQL Serverの上の数字をincementingを扱っていません。単純にID列を使用して、SQL Serverで大量の処理を実行させてください。 –

+0

@ ZoharPeled要件によっては、連続した番号の付いたオブジェクトが必要です。例えば、ステートメントの番号は1から始まり、連続して増やす必要があります(これはアカウント番号ごとに異なります)。 –

+0

@TT私は同意しますが、SQLサーバでそのように動作するように数値を取得することは、特にマルチユーザ環境では厄介なことがあります。ほとんどの場合、ID列が最適なオプションです。 –

答えて

1

はJOINと

declare @t as table (Id int, Equip int, Descr varchar(20)); 

-- simulates the batch processing 
insert into @t (Equip, Descr) values (400, 'Item 1'); 
insert into @t (Equip, Descr) values (400, 'Item 2'); 
insert into @t (Equip, Descr) values (500, 'Item 3'); 

-- generate the new id's in batch 

UPDATE t 
SET 
    Id = t.Equip + s.RowNum 
FROM @t t 
    JOIN (select Equip, 
       Descr, 
       ROW_NUMBER() OVER (PARTITION BY Equip ORDER BY Equip) RowNum 
      from @t) s 
    on t.Equip = s.Equip and t.Descr = s.Descr 

select * from @t 

選択入れ子にし、可能な場合、

+0

これは私が探していたものです。 varテーブルは例を簡単にするためのものでした。ありがとう。 – Ben

0

あなたがCTEとやりたいことができます。

WITH toupdate as (
     SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY t.Equip ORDER BY t.Equip) as seqnum 
     FROM @t t 
UPDATE t 
    SET 
     Id = m.NextId + seqnum 
    FROM toupdate t INNER JOIN 
     @maxs m 
     ON m.Equip = t.Equip; 

私はこれはしかし、良いアイデアあるか分かりません。 identityの列を使用して各行を識別することをお勧めします。ただし、グループ内での番号付けが補助キー(たとえば、請求書上の広告申込情報)として役立つケースは間違いありません。ただ、一緒に行く

+0

これもうまくいくはずです。その答えに近い類似のものを試したので、私はもう一つの答えを選びました。私は自分のテーブルにID列を持っています。これは、アイテムの他の基準に基づいてユニークなアイテム番号を使用する奇妙なシナリオの1つです。 – Ben

関連する問題