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不变。正当