【问题标题】:How to update the column to add auto increment using a MAX value from column?如何使用列中的 MAX 值更新列以添加自动增量?
【发布时间】:2020-02-04 08:27:48
【问题描述】:

我有一张这样的桌子:

CREATE TABLE #TempTable
(
    COLUMN1 INT,
    COLUMN2 INT
)

INSERT INTO #TempTable
  (
    COLUMN1,
    COLUMN2
  )
VALUES
  (1, 5),
  (2, 4),
  (3, NULL),
  (4, 2),
  (5, NULL)

我想更新 COLUMN2 以使用列中的 MAX 值添加自动增量。

我试过这个查询:

DECLARE @maxNumber        INT = 0;
SELECT @maxNumber = ISNULL(MAX(COLUMN2), 0) + 1
FROM   #TempTable

SELECT @maxNumber

CREATE SEQUENCE [tempSqu] AS [int] START 
WITH @maxNumber INCREMENT BY 1

UPDATE #TempTable
SET    COLUMN2 = NEXT VALUE FOR [tempSqu]
WHERE  COLUMN2 IS NULL

DROP sequence [tempSqu]

输出:

COLUMN1     COLUMN2
--------------------
1           5
2           4
3           6
4           2
5           7

【问题讨论】:

  • 您能否在问题中包含更新后的预期输出,以便更清楚?
  • 你想做什么?如果最新的条目被删除或更改,使用MAX+1 总是会产生重复的值。您也不需要 SEQUENCE 来生成递增值,您可以使用 ROW_NUMBER() 或任何其他排名函数来为每一行生成排名号

标签: sql sql-server


【解决方案1】:

试试这样的:

UPDATE tmp
SET tmp.COLUMN2 = @maxNumber, @maxNumber = @maxNumber + 1
FROM #TempTable tmp
WHERE tmp.COLUMN2 IS NULL

【讨论】:

  • 这是目前要求的最简单、最短的答案。
【解决方案2】:

您可以对动态 SQL 执行相同的操作,如下所示:

DECLARE @maxNumber INT = 0
    ,@sequenceDSQL VARCHAR(4000);

SELECT @maxNumber = ISNULL(MAX(COLUMN2), 0) + 1
FROM #TempTable

SET @sequenceDSQL = 'CREATE SEQUENCE [dbo].[tempSqu] AS [int] START WITH '
    + CAST(@maxNumber AS VARCHAR(19)) +
    'INCREMENT BY 1 UPDATE #TempTable
    SET COLUMN2 = NEXT VALUE FOR [tempSqu]
    WHERE COLUMN2 IS NULL
    DROP sequence [tempSqu]'

EXEC (@sequenceDSQL)

【讨论】:

    【解决方案3】:

    您也可以尝试使用Row_Number() 函数和inner join update,如下所示。

    注意:我在评论中提供了查询的逻辑。

    CREATE TABLE TempTable
    (
        COLUMN1     INT,
        COLUMN2     INT
    )
    
    INSERT INTO TempTable ( COLUMN1, COLUMN2 )
    VALUES (1, 5), (2, 4), (3, NULL), (4, 2), (5, NULL), (6, 9), (7, NULL), (8, NULL)
    
    --Getting the maximum value available in the table.
    declare @maxValue int = (Select top 1 Column2 from TempTable 
              where Column2 is not null order by column2 desc)
    
    Update 
         t set t.column2 = @maxValue + SrNo --Update with max value with SrNo as sequence 
    from TempTable t inner join (
      SELECT COLUMN1
            ,row_number() OVER (
                ORDER BY (
                        SELECT NULL
                        )
                ) AS SRNO --It will always give value in sequence like 1, 2, 3, ...
        FROM TempTable where COLUMN2 is null
    )temp on t.Column1 = temp.Column1 
    where t.column2 is null
    
    --Selecting the record after update
    Select * from TempTable order by column1
    

    这里是live db<>fiddle

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 2014-07-03
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多