2014-09-26 38 views
0

我正嘗試使用下一個數字更新表中的一列。帶計數器的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.

+7

哪個SQL引擎? MySQL,MSSQL,Oracle等?什麼是1.,2.,3.,4 ... - 它是ID字段還是什麼? – DarkSide 2014-09-26 20:22:22

+0

你怎麼知道你想讓用戶按照什麼順序編號?按字母順序? – 2014-09-26 20:39:47

回答

0

你可以試試這個,但我懷疑它會起作用。

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

你真的要告訴我們更多關於你的要求。看到我上面的評論。

+2

這將更新具有相同值的所有行,而不是遞增值(由於它的愚蠢子選擇限制,它不會在MySQL上工作) – 2014-09-26 20:50:16

+0

是的,正如我所說的「我懷疑這會起作用」:) – DarkSide 2014-09-26 21:58:52

3

如果你的數據庫支持row_number()你可以更新空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; 
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 
; 
3

如果使用MS SQL服務器,則你可以做的技巧是你可以更新一行並在同一行中設置一個變量,然後重新使用更新後的變量。

爲了說明,考慮以下內容:

DECLARE @NextID INT 
SET @NextID = 102 

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

這設置一個初始值來@NextId。你可以填充它如何適合你的邏輯。
然後它運行Table1上的更新並將@NextId + 1分配給EmpID,對於更新的第一行,在此示例中給出103。
然後,@NextId將更新爲剛分配給EmpId的值 - 再次爲103. 等等,所以後續行將得到104,然後是105,依此類推。

這種一次性更新變量和行值的方法非常有用,只要對特定問題稍作修改,就應該適用。