4

次のテーブル構造があります。

SubIdが null で、RawLineNumberが 1 ずつ昇順であり、SeqNumberが 1 ずつ昇順であるすべての行にSubIdを更新したいだけです。

RawlineNumber Claimid SubId SeqNumber
1             6000    A100  1
2             6000    NULL  2
3             6000    NULL  3
10            6000    A200  1
11            6000    NULL  2
25            6000    A300  1
26            6000    NULL  2
27            6000    NULL  3

RawLineNumber 2 と 3のSubId を A100 に、 RawLineNumber 11のSubIdを A200 に、RawLineNumber 26 と 27 の SubId を A300に
更新したいと考えています。

仕事をするカーソルがありますが、それを処理するために CTE を使用できますか?

4

3 に答える 3

7
UPDATE  m
SET     subid = q.subid 
FROM    mytable m
CROSS APPLY
        (
        SELECT  TOP 1 subid 
        FROM    mytable mi
        WHERE   mi.rawLineNumber  < m.rawLineNumber 
                AND mi.subid IS NOT NULL
        ORDER BY
                rawLineNumber DESC
        ) q
WHERE   m.subid IS NULL
于 2011-07-18T14:30:44.293 に答える
2

再帰的な解決策が要求されたので、それを書くことにしました。また、Seqnumbers と RawlineNumber のギャップに対しても機能します

declare @t table (RawlineNumber int, Claimid int, SubId varchar(5), SeqNumber int)

insert @t values(1, 6000, 'A100', 1)
insert @t values(2, 6000, NULL, 2)
insert @t values(3, 6000, NULL, 3)
insert @t values(10, 6000, 'A200', 1)
insert @t values(11, 6000, NULL, 2)
insert @t values(25, 6000, 'A300', 1)
insert @t values(26, 6000, NULL, 2)
insert @t values(27, 6000, NULL, 3)

;with cte as
(
select Rawlinenumber, SeqNumber, SubId
from @t where SubId is not null and SeqNumber = 1
union all
select t.Rawlinenumber, t.SeqNumber, c.SubId
from cte c
join
@t t
on c.Rawlinenumber + 1 = t.Rawlinenumber
and c.SeqNumber + 1 = t.SeqNumber
where t.SubId is null and t.SeqNumber > 1
)
update t 
set SubId = c.SubId
from @t t join cte c 
on c.Rawlinenumber = t.Rawlinenumber
where t.SeqNumber > 1

select * from @t
于 2011-07-18T16:36:39.430 に答える
0

それほど単純ではないSQLスクリプトは、必要なことを実現するはずです。

update my_table t1 set t1.subid = 
  (select t2.subid from my_table t2 
   where t2.rawlinenumber < t1.rawlinenumber
   and t2.seqnumber = 1
   and t2.rawlinenumber = (
                   select max(t3.rawlinenumber)
                   from my_table t3 
                   where t3.seq_number = 1
                   and t3.rawlinenumber <= t2.rawlinenumber)
where t1.subid is null;

内側の副選択(T3)は、現在の行の前にseqnumber = 1を持つ最後の行を提供し、外側の副選択は、この行のSubIDを提供します(ウィンドウ関数を使用する方が効率的ですが、特定のRDBMSについて言及しなかったため、私はこれに固執します:-))

于 2011-07-18T14:28:44.463 に答える