我需要根据其他列内容填充一个包含运行计数的列。表格如下:
count seq_num 1 123-456-789 1 123-456-780 1 123-456-990 2 123-456-789 2 123-456-990
因此,当seq_num列更改时,计数器将重置为“1”,并且当列重复时,计数器将递增1。
这是使用SQL2000,而seq_num字段是varchar。
有什么想法吗?
答案 0 :(得分:0)
如果要插入,可以使用子查询:
insert into
table (count, seq_num)
values
((select count(*)+1 from table where seq_num = @seq)
,@seq)
否则,你需要在那里有一个日期或某种方式告诉它如何确定第一个:
update table
set count =
(select count(*)+1 from table t2
where t2.seq_num = table.seq_num
and t2.insertdate < table.insertdate)
答案 1 :(得分:0)
如果您将来需要继续更新,可以试试这个。这是几个步骤,但会修复它并设置它以备将来使用。 (可能需要检查我的语法 - 我现在更多地讨论ORacle,所以我可能混淆了一些东西 - 但逻辑应该有效。)
首先,创建一个表来包含每个序列的当前计数器级别:
Create newTable (counter int, sequence varchar)
然后,用这样的数据填充它: 插入newTable (选择不同的0作为计数器,序列 来自表) 这将把每个序列号放在表中一次,每个序列的计数器将设置为0。
然后,创建一个带有TWO更新语句和一些额外逻辑的更新过程:
Create procedere counterUpdater(@sequence varchar) as
Declare l_counter as int;
select l_counter = counter
from newTable
where sequence = @sequence
--assuming you have a primary key in the table.
Declare @id int;
Select top 1 @id = id from table
where sequence = @sequence
and counter is null;
--update the table needing edits.
update table
set counter = l_counter + 1
where id = @id
--update the new table so you can keep track of which
--counter you are on
update newTable
set counter = l_counter + 1
where id = @id
然后运行一个proc来为表中的每条记录执行此proc。
现在,您应该为表中的每条记录填充当前使用的计数器的“newTable”。设置插入过程,以便在创建新记录时,如果它是新表中尚未存在的序列,则将其添加为计数1,并在主表中放置计数1。如果序列DOES已经存在,请使用上面的逻辑(增加已使用的计数“newTable”并将该计数值作为计数器值放在newTable和mainTable中。
基本上,此方法决定使用内存代替查询现有表。如果你有一个包含大量重复序列号的大表,那将是最有益的。如果您的序列号只发生两次或三次,您可能希望在更新后再进行查询,然后再插入:
首先,要更新: - 找出计数器值 声明l_counter int select l_counter = max(counter) 从表中序列= @sequence
update table
set counter = l_counter + 1
where id = (select top 1 id from table where sequence = @sequence
and counter is null)
然后为每条记录运行。
然后,在插入新记录时:
Declare l_counter int
select l_counter = max(counter)
from table where sequence = @sequence
IsNull(l_counter, 0)
Insert into table
(counter, sequence) values (l_counter + 1, @sequence)
同样,我很肯定我在这里混合和匹配我的语法,但概念应该有效。当然,它是一个“一次一个”的方法而不是基于设置,所以它可能有点低效,但它会起作用。