带计数器的SQL Update表

时间:2014-09-26 20:19:37

标签: sql

我正在尝试使用下一个数字更新表格中的列。

以下是一个例子:

表1

User1    100
User2    101
User3    102
User4    NULL
User5    NULL
User6    NULL

我需要它去

User1  100
User2  101
User3  102
User4  103
User5  104
User6  105

我尝试了几件事:

update Table1
set EmpID = MAX(empid)+1
where UserName = null

但这只会将所有空值设置为103。

5 个答案:

答案 0 :(得分:3)

如果你的数据库支持row_number(),你可以将null EmpId更新为row_number() + max(EmpId)

update t1
set t1.EmpId = t2.rn
from Table1 t1 
join (select UserName,      
    row_number() over(partition by EmpId order by UserName) 
    + (select max(EmpId) from Table1) rn      
    from Table1 
    where EmpId is null) t2
on t1.UserName = t2.UserName
where t1.EmpId is null;

答案 1 :(得分:3)

这就是我用Postgres做的事情:

with numbered_users as (
   select username,
          empid,
          (select max(empid) from table1) as max_id,
          row_number() over (order by username) as rn
   from table1
   where empid is null
)
update table1 
   set empid = nu.max_id + nu.rn
from numbered_users nu
where nu.username = table1.username 
   and table1.empid is null
;

答案 2 :(得分:3)

如果使用 MS SQL Server ,那么您可以做的一个技巧是可以更新行并在同一个go中设置变量,然后重用更新的变量。

为了说明,请考虑以下事项:

DECLARE @NextID INT
SET @NextID = 102

UPDATE Table1
 SET @NextID = EmpID = @NextID + 1
WHERE EmpID IS NULL

这会将初始值设置为@NextId。你可以填充它如何适合你的逻辑 然后它运行Update over Table1并将@NextId + 1分配给EmpID,对于第一行更新,在此示例中给出103。 然后@NextId将更新为刚刚用于分配给EmpId的值 - 再次103。 等等,所以后续行将获得104然后是105,依此类推。

这种一次性更新变量和行值的方法非常有用,只要对您的特定问题稍作修改,它就应该适用。

答案 3 :(得分:0)

您可以使用此

UPDATE [Table1] SET [EmpID ] = [EmpID] +1 WHERE [UserName] = N'User1'

答案 4 :(得分:-1)

你可以尝试这个,但我怀疑它会起作用。

UPDATE Table1 SET
    EmpID = (SELECT MAX(EmpID) FROM Table1)+1
WHERE EmpID IS NULL

您真的需要告诉我们更多有关您的要求的信息。请参阅上面的评论。