SQL - 如何使用递增1的每个行值更新列?

时间:2017-12-08 09:47:58

标签: sql sql-server loops auto-increment row-number

对于列中的选定行,如何从开头到结尾按顺序更新每一行,每行值增加1(或某个数字)。我知道这可以在几秒钟内完成excel但我可以弄清楚如何在SQL服务器中实现。例如:

客户ID现在为NULL 更新客户ID,每行增加1(即第一行= 1,第二行= 2,......第n行= n)

ship-to party   customer id 
0002018092      NULL
0002008127      NULL
0002000129      NULL
0002031592      NULL
0002034232      NULL

期望的输出

ship-to party   customer id
0002018092      1
0002008127      2
0002000129      3
0002031592      4
0002034232      5

此外,对于列中的选定行,如何使用行号更新每一行?我知道有一个row_number()函数,但没有成功产生所需的结果。例如

列A现在为NULL 更新A列,每行增加1(即第一行=第1行,第二行=第2行,第n行=行号n)

任何演示都会非常有帮助。你好

5 个答案:

答案 0 :(得分:2)

示例:假设我想为表SomeIntField中的tblUser列中的每个值添加一个值

有两种方法可以轻松完成

首先:这只是为每列SomeIntField

添加值1
update tblUser set SomeIntField = SomeIntField + 1

第二:这会增加一个递增值,第一行获得+1,第二行获得+2,依此类推......

declare @number int = 0

update tblUser
set    @number = @number + 1,    
       SomeIntField = isnull(SomeIntField, 0) + @Number

编辑:根据您的上一条评论,这可能是您想要的

declare @table table (shiptoparty varchar(50), customer_id int)

insert into @Table (shiptoparty, customer_id)
values ('0002018092', NULL), ('0002008127', NULL), ('0002000129', NULL), ('0002031592', NULL), ('0002034232', NULL)

declare @number int = 0

update @table
set    @number = @number + 1,    
       customer_id = isnull(customer_id, 0) + @Number

select * from @table

结果是:

shiptoparty | customer_id   
----------- | -----------   
0002018092  | 1 
0002008127  | 2 
0002000129  | 3 
0002031592  | 4 
0002034232  | 5 

答案 1 :(得分:1)

不要想得很复杂。试试下面给出的简单方法

alter table table_name drop column customer_id
go
alter table table_name add id customer_id IDENTITY(1,1)
go

答案 2 :(得分:0)

使用CTE:

,而不是使用自引用变量
WITH CTE AS (
    SELECT [Your Incrementing Column],
           ROW_NUMBER() OVER (ORDER BY [Columns to Order By]) AS RN
    FROM YourTable)
UPDATE CTE
SET [Your Incrementing Column] = RN;

编辑:要证明所有行将会更新:

CREATE TABLE #Sample (String varchar(50),
                      IncrementingInt int);

INSERT INTO #Sample (String)
VALUES ('sdkfjasdf'),
       ('dfydsfdfg'), 
       ('sdfgsdfg45yfg'),
       ('dfgf54d'),
       ('dsft43tdc'),
       ('f6gytrntrfu7m45'),
       ('5d6f45wgby54'),
       ('g34h636j'),
       ('jw'),
       ('h6nw54m'),
       ('g54j747jm5e5f4w5gsft'),
       ('ns67mw54mk8o7hr'),
       ('h45j4w5h4');

SELECT *
FROM #Sample;

WITH CTE AS(
    SELECT IncrementingInt,
           ROW_NUMBER() OVER (ORDER BY String) AS RN
    FROM #Sample)
UPDATE CTE
SET IncrementingInt = RN;

SELECT *
FROM #Sample;

DROP TABLE #Sample;
GO

答案 3 :(得分:0)

第一个问题:

您希望将某列中每行的值增加1(或其他nuber),请尝试以下操作:

@RequestMapping(value="firstMapping",method=RequestMethod.POST)
public ModelAndView firstMapping (HttpServletRequest request) {
    Object myObject=new Object();
   request.setAttribute("myObject",myObject);
    return "forward:/secondMapping";
}

第二个问题:

您希望仅获取某些行的行号。解决方案:首先创建包含所有行号的列,然后获取行:

update TABLE_NAME set column_to_increase = column_to_increase + 1

FYI:select * from ( select column1, column2, ..., columnN, row_number() over (order by (select null)) as [rn] from MY_TABLE ) where *condition* 子句中的select null什么都不做,就在那里,因为窗函数(例如over)必须有row_number子句,其中一些需要over

答案 4 :(得分:0)

使用行号

更新每一行

尝试以下

CREATE TABLE tmp(Id INT IDENTITY(1,1), Value INT)

INSERT INTO tmp(value) VALUES(1),(2),(3),(4),(5)

UPDATE T
SET
T.Value = B.RowNo
FROM tmp AS T 
INNER JOIN (SELECT Id, ROW_NUMBER()OVER(ORDER BY Id) AS RowNo FROM tmp)AS B
ON T.Id = B.Id