Подтвердить что ты не робот

Обновить столбец int в таблице с уникальными значениями приращения

Я пытаюсь заполнить любые строки, в которых отсутствует значение в столбце InterfaceID (INT) с уникальным значением для каждой строки.

Я пытаюсь выполнить этот запрос:

UPDATE prices SET interfaceID = (SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices) 
       WHERE interfaceID IS null

Я надеялся, что (SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices) будет оцениваться для каждой строки, но только один раз, и все мои затронутые строки получают одинаковое значение вместо разных значений.

Можно ли это сделать в одном запросе?

4b9b3361

Ответ 1

declare @i int  = SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices


update prices
set interfaceID  = @i , @i = @i + 1
where interfaceID is null

должен выполнить работу

Ответ 2

DECLARE @IncrementValue int
SET @IncrementValue = 0 
UPDATE Samples SET qty = @IncrementValue,@[email protected]+1

Ответ 3

простой запрос был бы, просто установите переменную на некоторое число, которое вы хотите. затем обновите требуемый столбец, увеличив 1 с этого номера. для всех строк он будет обновлять каждый идентификатор строки, увеличивая 1

SET @a  = 50000835 ;  
UPDATE `civicrm_contact` SET external_identifier = @a:[email protected]+1 
WHERE external_identifier IS NULL;

Ответ 4

В продуктах, основанных на оракуле, вы можете использовать следующий оператор:

update table set interfaceID=RowNum where condition;

Ответ 6

Попробуйте что-то вроде этого:

with toupdate as (
    select p.*,
           (coalesce(max(interfaceid) over (), 0) +
            row_number() over (order by (select NULL))
           ) as newInterfaceId
    from prices
   )
update p
    set interfaceId = newInterfaceId
    where interfaceId is NULL

Это не делает их последовательными, но назначает новые высшие идентификаторы. Чтобы сделать их последовательными, попробуйте следующее:

with toupdate as (
    select p.*,
           (coalesce(max(interfaceid) over (), 0) +
            row_number() over (partition by interfaceId order by (select NULL))
           ) as newInterfaceId
    from prices
   )
update p
    set interfaceId = newInterfaceId
    where interfaceId is NULL

Ответ 7

Предполагая, что у вас есть первичный ключ для этой таблицы (вы должны иметь), а также с помощью CTE или WITH, также можно использовать обновление с самосоединением в той же таблице:

UPDATE a
SET a.interfaceId = b.sequence
FROM prices a
INNER JOIN
(
   SELECT ROW_NUMBER() OVER ( ORDER BY b.priceId ) + ( SELECT MAX( interfaceId ) + 1 FROM prices ) AS sequence, b.priceId
   FROM prices b
   WHERE b.interfaceId IS NULL
) b ON b.priceId = a.priceId

Я предположил, что основным ключом является идентификатор цены.

Производная таблица, псевдоним b, используется для создания последовательности с помощью функции ROW_NUMBER() вместе с столбцами (ами) первичного ключа. Для каждой строки, где идентификатор интерфейса столбца равен NULL, это приведет к созданию строки с уникальным значением последовательности вместе с значением первичного ключа.

Можно упорядочить последовательность в некотором другом порядке, а не в первичном ключе.

Последовательность смещается по текущему MAX-интерфейсу-id + 1 через подзапрос. Функция MAX() игнорирует значения NULL.

Предложение WHERE ограничивает обновление для тех строк, которые являются NULL.

Затем производная таблица объединяется в одну и ту же таблицу, псевдоним a, соединяется в столбцах первичного ключа с обновляемым столбцом, установленным в сгенерированную последовательность.