Ответ 1
declare @i int = SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices
update prices
set interfaceID = @i , @i = @i + 1
where interfaceID is null
должен выполнить работу
Я пытаюсь заполнить любые строки, в которых отсутствует значение в столбце 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)
будет оцениваться для каждой строки, но только один раз, и все мои затронутые строки получают одинаковое значение вместо разных значений.
Можно ли это сделать в одном запросе?
declare @i int = SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices
update prices
set interfaceID = @i , @i = @i + 1
where interfaceID is null
должен выполнить работу
DECLARE @IncrementValue int
SET @IncrementValue = 0
UPDATE Samples SET qty = @IncrementValue,@[email protected]+1
простой запрос был бы, просто установите переменную на некоторое число, которое вы хотите. затем обновите требуемый столбец, увеличив 1 с этого номера. для всех строк он будет обновлять каждый идентификатор строки, увеличивая 1
SET @a = 50000835 ;
UPDATE `civicrm_contact` SET external_identifier = @a:[email protected]+1
WHERE external_identifier IS NULL;
В продуктах, основанных на оракуле, вы можете использовать следующий оператор:
update table set interfaceID=RowNum where condition;
Для Postgres
ALTER TABLE table_name ADD field_name serial PRIMARY KEY
ССЫЛКА: https://www.tutorialspoint.com/postgresql/postgresql_using_autoincrement.htm
Попробуйте что-то вроде этого:
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
Предполагая, что у вас есть первичный ключ для этой таблицы (вы должны иметь), а также с помощью 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, соединяется в столбцах первичного ключа с обновляемым столбцом, установленным в сгенерированную последовательность.