Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/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
Tsql 是否使用无重复项的升序值更新DB中的值?_Tsql_Duplicates_Sql Update - Fatal编程技术网

Tsql 是否使用无重复项的升序值更新DB中的值?

Tsql 是否使用无重复项的升序值更新DB中的值?,tsql,duplicates,sql-update,Tsql,Duplicates,Sql Update,我使用此查询以升序值更新列: DECLARE @counter NUMERIC(10, 0) SET @counter = 1400000 UPDATE SomeTable SET @counter = SomeColumn = @counter + 1 问题是,我怎么能不把副本放在那里?例如,该列已将1400002作为值。通常它有空值,但有时没有。我可以补充一点 where SomeColumn is null 但这并不能避免重复。有什么想法吗 谢谢我不确定这是否有用,但您可以将现有数

我使用此查询以升序值更新列:

DECLARE @counter NUMERIC(10, 0)
SET @counter = 1400000
UPDATE SomeTable
SET  @counter = SomeColumn = @counter + 1 
问题是,我怎么能不把副本放在那里?例如,该列已将1400002作为值。通常它有空值,但有时没有。我可以补充一点

where SomeColumn is null
但这并不能避免重复。有什么想法吗


谢谢

我不确定这是否有用,但您可以将现有数据放入临时表,然后使用该临时表删除重复项,如:

WHERE (@counter + 1)  not in ( select SomeColumn from #temp)

如果上述内容不正确,请进一步解释您的问题。

我不确定这是否有帮助,但您可以将现有数据放入临时表,然后使用该临时表删除重复项,如:

WHERE (@counter + 1)  not in ( select SomeColumn from #temp)

如果以上不正确,请进一步解释您的问题。

这在SQL Server 2008中对我很有效:

DECLARE @StartNumber int, @EndNumber int;
SET @StartNumber = 100;
SELECT @EndNumber = @StartNumber + COUNT(*) - 1 FROM SomeTable;
WITH numbers AS (
  SELECT @StartNumber AS Value
  UNION ALL
  SELECT 
    Value + 1
  FROM numbers
  WHERE Value < @EndNumber
),
validnumbers AS (
  SELECT
    n.Value,
    rownum = ROW_NUMBER() OVER (ORDER BY n.Value)
  FROM numbers n
    LEFT JOIN SomeTable t ON n.Value = t.Value
  WHERE t.Value IS NULL
),
RowsToUpdate AS (
  SELECT
    Value,
    rownum = ROW_NUMBER() OVER (ORDER BY Value)
  FROM SomeTable
  WHERE Value IS NULL
     OR Value NOT IN (SELECT Value FROM numbers)
)
UPDATE r 
SET Value = v.Value
FROM RowsToUpdate r
  INNER JOIN validnumbers v ON v.rownum = r.rownum;
基本上,它实现了以下步骤:

创建一个数字表

排除SomeTable中的数字

对其余的行进行排序

排除数字表中存在的某些表中的值

对其余的行进行排序

从排名编号列表更新SomeTable的排名行


不确定此解决方案对大型表有多好,不过…

这在SQL Server 2008中对我很有效:

DECLARE @StartNumber int, @EndNumber int;
SET @StartNumber = 100;
SELECT @EndNumber = @StartNumber + COUNT(*) - 1 FROM SomeTable;
WITH numbers AS (
  SELECT @StartNumber AS Value
  UNION ALL
  SELECT 
    Value + 1
  FROM numbers
  WHERE Value < @EndNumber
),
validnumbers AS (
  SELECT
    n.Value,
    rownum = ROW_NUMBER() OVER (ORDER BY n.Value)
  FROM numbers n
    LEFT JOIN SomeTable t ON n.Value = t.Value
  WHERE t.Value IS NULL
),
RowsToUpdate AS (
  SELECT
    Value,
    rownum = ROW_NUMBER() OVER (ORDER BY Value)
  FROM SomeTable
  WHERE Value IS NULL
     OR Value NOT IN (SELECT Value FROM numbers)
)
UPDATE r 
SET Value = v.Value
FROM RowsToUpdate r
  INNER JOIN validnumbers v ON v.rownum = r.rownum;
基本上,它实现了以下步骤:

创建一个数字表

排除SomeTable中的数字

对其余的行进行排序

排除数字表中存在的某些表中的值

对其余的行进行排序

从排名编号列表更新SomeTable的排名行


不确定这个解决方案对大型表有多好,但是…

您的意思是,这就像有一个表有一列这样的值:NULL、1、NULL、12、15、NULL、8、NULL,例如,我们要存储一个从10开始的值序列。在这种情况下,我们应该避免改变序列中的值。那么,在我的例子中,我们应该保持12和15不变。对吗?你的意思是,如果有一个表有一列这样的值:NULL,1,NULL,12,15,NULL,8,NULL,我们想存储一个从10开始的值序列,例如。在这种情况下,我们应该避免改变序列中的值。那么,在我的例子中,我们应该保持12和15不变。正当