Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:在递增id时逐个更新多行_Sql_Sql Server - Fatal编程技术网

SQL Server:在递增id时逐个更新多行

SQL Server:在递增id时逐个更新多行,sql,sql-server,Sql,Sql Server,我对SQL还很陌生,我想过了一段时间后我就可以自如地使用它了,但它仍然很难。我正在尝试增加ID。我知道我可以使用自动递增,但在这种情况下,id与几个类别有关系,所以它必须以不同的数字开始,所以我不能这样做 该表如下所示: id category ---------------- 1000 1 1000 1 ... 2000 2 2000 2 ... 我想做到: id category ------------------ 1000 1 1001 1 10

我对SQL还很陌生,我想过了一段时间后我就可以自如地使用它了,但它仍然很难。我正在尝试增加ID。我知道我可以使用自动递增,但在这种情况下,id与几个类别有关系,所以它必须以不同的数字开始,所以我不能这样做

该表如下所示:

id     category
----------------
1000   1
1000   1
...
2000   2
2000   2
...
我想做到:

id     category
------------------
1000   1
1001   1
1002   1
...
2000   2
2001   2
...
我试过:

UPDATE T1
SET id = CASE 
             WHEN EXISTS (SELECT id FROM STYLE WHERE T1.id = id)
                THEN (SELECT MAX(CAST(id AS INT)) + 1  
                      FROM STYLE 
                      WHERE category = T1.category) 
         END
FROM STYLE T1 
WHERE idStyle = idStyle

但它只是在所有行中添加了1。我怎样才能以1乘1的方式得到递增的max id呢?谢谢。

您可以改用
行号()
函数:

select *, 
       concat(cid, row_number() over (partition by id order by category)-1) as NewId
from style s;

在缺少实际样本数据的情况下,这是一个伪sql,但是,类似于

UPDATE YT
----SELECT NULL as Ihave no context of other fields in your table
SET id = id + ROW_NUMBER() OVER (PARTITION BY category ORDER BY (SELECT NULL)) - 1
FROM YourTable YT;

您可以使用游标来迭代表。这里有一个指向MSDN文档的链接,说明如何声明游标,并使用它来迭代表()为自定义id和类别添加一个单独的列,然后自己维护它。索引它的搜索速度。让数据库负责自动递增ID。试图与数据库争夺谁维护表关系ID将以眼泪告终-/使用
光标
将是一种糟糕的方法。它可能非常慢。所以,如果任何1个
Id
Category
都有1000多个值,该怎么办?@Larnu True,我刚才在回答他的问题:“我如何才能1乘1,这样它才能真正得到递增的max Id”