我正在尝试使用每行唯一值填充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)
,但它只执行一次,所以我所有受影响的行都得到相同的值而不是不同的值。
这可以在一个查询中完成吗?
答案 0 :(得分:74)
declare @i int = SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices
update prices
set interfaceID = @i , @i = @i + 1
where interfaceID is null
应该做的工作
答案 1 :(得分:17)
DECLARE @IncrementValue int
SET @IncrementValue = 0
UPDATE Samples SET qty = @IncrementValue,@IncrementValue=@IncrementValue+1
答案 2 :(得分:4)
简单查询就是,只需将变量设置为您想要的某个数字。 然后通过从该数字递增1来更新所需的列。对于所有行,它将通过递增1
来更新每个行idSET @a = 50000835 ;
UPDATE `civicrm_contact` SET external_identifier = @a:=@a+1
WHERE external_identifier IS NULL;
答案 3 :(得分:2)
在基于oracle的产品中,您可以使用以下语句:
update table set interfaceID=RowNum where condition;
答案 4 :(得分:2)
对于Postgres
ALTER TABLE table_name ADD field_name serial PRIMARY KEY
参考:https://www.tutorialspoint.com/postgresql/postgresql_using_autoincrement.htm
答案 5 :(得分:1)
尝试这样的事情:
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
这并不能使它们连续,但它会分配新的更高的ID。要使它们连续,请尝试:
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
答案 6 :(得分:1)
假设您拥有此表的主键(您应该拥有),以及使用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
我假设主键是price-id。
派生表别名b用于通过ROW_NUMBER()函数和主键列生成序列。对于列interface-id为NULL的每一行,这将生成一个具有唯一序列值和主键值的行。
可以按照其他顺序而不是主键来排序序列。
序列由当前MAX接口-id + 1通过子查询偏移。 MAX()函数忽略NULL值。
WHERE子句将更新限制为那些为NULL的行。
然后,派生表将连接到同一个表,别名a,连接主键列,并将要更新的列设置为生成的序列。
答案 7 :(得分:-1)
您可以尝试:
DECLARE @counter int
SET @counter = 0
UPDATE [table]
SET [column] = @counter, @counter = @counter + 1```