Mal*_*are 50 sql sql-server sql-server-2008
我试图填充任何缺少其InterfaceID (INT)列中值的行,每行具有唯一值.
我正在尝试执行此查询:
UPDATE prices SET interfaceID = (SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices)
WHERE interfaceID IS null
Run Code Online (Sandbox Code Playgroud)
我希望(SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices)对每一行进行评估,但它只进行一次,所以我所有受影响的行都得到相同的值而不是不同的值.
这可以在一个查询中完成吗?
WKo*_*dos 75
declare @i int = SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices
update prices
set interfaceID = @i , @i = @i + 1
where interfaceID is null
Run Code Online (Sandbox Code Playgroud)
应该做的工作
小智 17
DECLARE @IncrementValue int
SET @IncrementValue = 0
UPDATE Samples SET qty = @IncrementValue,@IncrementValue=@IncrementValue+1
Run Code Online (Sandbox Code Playgroud)
简单的查询就是,只需将变量设置为所需的数字即可。然后通过从该数字增加1来更新所需的列。对于所有行,它将通过递增1来更新每个行ID
SET @a = 50000835 ;
UPDATE `civicrm_contact` SET external_identifier = @a:=@a+1
WHERE external_identifier IS NULL;
Run Code Online (Sandbox Code Playgroud)
假设您有该表的主键(您应该有),并且使用 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
Run Code Online (Sandbox Code Playgroud)
我假设主键是价格 ID。
派生表(别名 b)用于通过 ROW_NUMBER() 函数与主键列一起生成序列。对于列 interface-id 为 NULL 的每一行,这将生成具有唯一序列值以及主键值的行。
可以按其他顺序而不是主键对序列进行排序。
该序列通过子查询偏移当前 MAX interface-id + 1。MAX() 函数忽略 NULL 值。
WHERE 子句限制对 NULL 行的更新。
然后将派生表连接到同一个表(别名 a),连接主键列并将要更新的列设置为生成的序列。