SQL Update逐行

时间:2009-11-03 19:58:11

标签: sql cursor sql-update

我的SQL表有两个影响我的问题的字段:“Priority”为真,Start_Date为datetime。当用户向表中添加项目时,他指定给定Start_Date的优先级。

如果Item1为优先级1,则Item2可能为优先级2,并且在第1项之后将给予Start_Date。

但是如果Item2的优先级为0.5(或任何小于Item1优先级的数字),则其Start_Date将之前项目1的Start_Date。

添加每个项目之后,我想浏览项目列表并更新所有优先级,使它们是整数,从最早的Start_Date开始,优先级= 1,然后是2,3,等等。

我正在使用SQL 2005.我知道我可以使用游标执行此操作。有没有更好的办法?怎么样?

谢谢。

3 个答案:

答案 0 :(得分:0)

您可以使用临时表执行此操作。可能有更好的方法,但我现在想不到一个。这也假设你的桌子上有一个主键 - 如果它只是开始日期和优先级,那么这个解决方案是不可行的。

create table #tempOrder (newPriority int identity,
                         id int)

insert into #tempOrder (id) select id from table order by Start_Date

update table set priority = newPriority 
  from #tempOrder
  where #tempOrder.id = table.id

我对你的问题不理解的一件事是优先级为0.5。您提到优先级按开始日期的顺序分配,但也提到手动将优先级设置为0.5。什么时候会发生?如果该优先级的开始日期与开始日期的优先级顺序冲突,那么该行为应该是什么?

答案 1 :(得分:0)

UPDATE mt
SET Priority = 
    (
     SELECT COUNT(*) 
     FROM MyTable mt2 
     WHERE mt2.Start_Date <= mt.Start_Date
    )
FROM MyTable mt

答案 2 :(得分:0)

如果所有的开始时间都是唯一的,请尝试这个(在Begin Trans内部,这样你可以查看结果并回滚,如果它不是你想要的那样)

   Update Table Set 
     Priority = (Select Count(*) From table 
                 Where Start_Date <= T.Start_Date)
   From Table T
   Where Start_Date > getDate()

如果它们不是唯一的,你会获得一些具有相同优先级的行(其中DateTimes相同)和优先级序列中的一些空白......