这是使用临时表、聚合和合并的实现。我假设您希望保存最大位置值。
现在看这个,您可能会认为您可以跳过临时表并仅将values
其用作merge
. 虽然您可以将值用作源,on
但只能有 0 或 1 个匹配项,多行将导致错误消息。
您可能认为我对索引很感兴趣,但它们会加速聚合和连接。如果性能不是问题或空间是问题,请跳过它们。
如果您认为表格中已经存在的位置不会高于您正在插入的值,或者如果您不关心最终的位置是否较低,则可以删除AND ff.position < source.pos
。MATCHED
IF OBJECT_ID('tempdb..#formsFields2') IS NOT NULL
BEGIN
DROP TABLE #formsFields2
END
CREATE TABLE #formsFields2 (
[formID] [int] NOT NULL,
[fieldGUID] [varchar](50) NOT NULL,
[position] [int] NOT NULL
)
CREATE NONCLUSTERED INDEX #formsFields2_IX_position
ON #formsFields2([position])
CREATE NONCLUSTERED INDEX #formsFields2_IX_ids
ON #formsFields2([formID], [fieldGUID])
INSERT INTO #formsFields2(formID, fieldGUID, position)
VALUES
(1, '{52E9A16E-B489-4577-955F-05749AB0481B}', 1),
(1, '{52E9A16E-B489-4577-955F-05749AB0481B}', 2)
MERGE formsFields AS ff
USING (
SELECT formID, fieldGUID, MAX(position)
FROM #formsFields2
GROUP BY formID, fieldGUID
) AS source (formID, fieldGUID, pos)
ON (ff.formID = source.formID AND ff.fieldGUID = source.fieldGUID)
WHEN MATCHED AND ff.position < source.pos THEN UPDATE SET ff.Position = source.pos
WHEN NOT MATCHED THEN INSERT VALUES (formID, fieldGUID, pos);