sql-server - 使用具有循环的游标更新列

标签 sql-server

我有一张 table

| code | descd | slnum |
|------|-------|-------|
| 10   | a     | 0     |
| 10   | b     | 0     |
| 12   | c     | 0     |
| 12   | d     | 0     |
| 11   | e     | 0     |
| 11   | f     | 0     |

我必须使用具有循环的游标来更新 slnum 列

| code | descd | slnum |
|------|-------|-------|
| 10   | a     | 1     |
| 10   | b     | 2     |
| 12   | c     | 1     |
| 12   | d     | 2     |
| 11   | e     | 1     |
| 12   | f     | 3     |

如何解决这个问题?我已经尝试过这样的操作,但它没有给我正确的输出

DECLARE @value INT  
DECLARE @s INT=1   

DECLARE scursor  CURSOR FOR  

SELECT slnum  
FROM trec   
for update of slnum  

OPEN scursor  

FETCH NEXT FROM scursor  
INTO @value  

WHILE @@FETCH_STATUS = 0  
BEGIN  
    if exists(select * from trec) -- missing  
    begin  
    update trec  
    set slnum=@s  
    where current of scursor  
    select @s=@s+1  
    end  
    else   
    begin  
    update trec  
    set slnum=@s          
    where current of scursor  
    end  
    FETCH NEXT FROM scursor INTO @value  
END  

CLOSE scursor  
DEALLOCATE scursor  

最佳答案

我不知道您是否必须使用游标,但您的查询对于使用ROW_NUMBER<的UPDATE连接来说是一个死胡同。/:

UPDATE t1
SET
    slnum = t2.slnum
FROM
    yourTable t1
INNER JOIN
(
    SELECT code,
           descd,
           ROW_NUMBER() OVER(PARTITION BY code ORDER BY descd) AS slnum
    FROM yourTable
) t2
    ON t1.code = t2.code AND
       t1.descd = t2.descd

关于sql-server - 使用具有循环的游标更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202116/

相关文章:

sql-server - 为什么T-SQL中的LAG函数是不确定的?

c# - ADO.NET、SQL Server、C# : how to check if a certain parameter does not exist before performing an Insert in a database

c# - SqlCommand select from where 问题

C# SQL 查询返回什么不返回?

mysql - SQL - 如何计算自定义创建的错误代码

sql - 如何连续获得员工的所有拳头?

SQL Server 2014 Express 设置

c# - 如何检测单击了数据列表项的哪个元素?

sql - 如何将两个不同查询的结果相乘

mysql - 将 MySQL 迁移到 SQL Server - 外键给出了一个不清楚的错误(对我来说)