4

我有以下表结构。

我只想将 SubId 更新它为空的所有行,并且RawLineNumber以 1 递增并且SeqNumber以 1 递增。

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

我想用 A100 更新
RawLineNumber 2 和 3的SubId,用 A200 更新 RawLineNumber 11
SubId ,用 A300
更新RawLineNumber 26 和 27的SubId。

我有一个可以完成这项工作的光标,但我可以有一个 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 回答