0

我有一个包含 3 列的关系表

表单字段

[formID] [int] NOT NULL,
[fieldGUID] [varchar](50) NOT NULL,
[position] [int] NOT NULL

formID并且fieldGUID列在索引/键中具有唯一约束。

目前我正在同时插入所有关系,例如:

INSERT INTO formsFields(formID, fieldGUID, position)
VALUES 
(1, '{52E9A16E-B489-4577-955F-05749AB0481B}', 0),
(1, '{52E9A16E-B489-4577-955F-05749AB0481B}', 1), 
....

使用唯一约束,数据库将不允许重复,但如果我插入的任何行重复,则查询将失败。

他们是一种运行这样的插入并忽略重复项的方法吗?也许甚至插入临时表并将其合并到真实表中?需要一点帮助来为此编写查询。

4

1 回答 1

0

这是使用临时表、聚合和合并的实现。我假设您希望保存最大位置值。

现在看这个,您可能会认为您可以跳过临时表并仅将values其用作merge. 虽然您可以将值用作源,on但只能有 0 或 1 个匹配项,多行将导致错误消息。

您可能认为我对索引很感兴趣,但它们会加速聚合和连接。如果性能不是问题或空间是问题,请跳过它们。

如果您认为表格中已经存在的位置不会高于您正在插入的值,或者如果您不关心最终的位置是否较低,则可以删除AND ff.position < source.posMATCHED

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);
于 2013-07-16T02:33:04.467 回答