Обновить значение в БД с возрастающими значениями без дубликатов? - PullRequest
2 голосов
/ 01 июня 2011

Я использую этот запрос для обновления столбца с возрастающими значениями:

DECLARE @counter NUMERIC(10, 0)
SET @counter = 1400000
UPDATE SomeTable
SET  @counter = SomeColumn = @counter + 1 

Вопрос в том, как я не могу поместить туда дубликаты?Например, столбец уже имеет значение 1400002.Обычно он имеет значения NULL, но иногда его нет.Я мог бы добавить

where SomeColumn is null

, но это не позволило бы избежать дубликатов.Есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 июня 2011

Это работало для меня в 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;

По сути, оно реализует следующие шаги:

  1. Создание таблицы чисел.

  2. Исключить числа, присутствующие в SomeTable.

  3. Ранжировать остальные строки.

  4. Исключитьзначения из SomeTable, присутствующие в числовой таблице.

  5. Ранжирование остальных строк.

  6. Обновление ранжированных строк SomeTable из списка ранжированных номеров.

Не уверен, насколько хорошим будет это решение для больших таблиц, хотя ...

0 голосов
/ 01 июня 2011

Я не уверен, что это поможет или нет, но вы можете поместить свои существующие данные в temp table и затем использовать это temp table для удаления дубликатов, таких как:

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

Если вышеприведенное неверно, объясните, пожалуйста, ваш вопрос немного подробнее.

...