我正在尝试编写代码,批量导入大量行到数据库中。
目前,我将原始数据(从.csv文件)批量复制到临时表中,以便全部在数据库端。这给我留下了一个充满行标识“联系人”的临时表。现在需要将它们移动到数据库的其他表中。
接下来,我将来自临时表中的行复制到contacts表中我尚未拥有的行,对于我已经拥有的行,我需要更新名为“GroupToBeAssignedTo”的列,指示稍后的操作I将表演。
我有一种感觉,我错了。查询效率不高,我正在寻找有关如何做得更好的建议。
update [t1]
set [t1].GroupToBeAssignedTo = [t2].GroupToBeAssignedTo from Contacts [t1]
inner join ContactImportStaging [t2] on [t1].UserID = [t2].UserID AND [t1].EmailAddress = [t2].EmailAddress AND [t2].GUID = @GUID
where not exists
(
select GroupID, ContactID from ContactGroupMapping
where GroupID = [t2].GroupToBeAssignedTo AND ContactID = [t1].ID
)
最好只导入所有行而不先检查重复项,然后再“清理”数据?寻找我出错的地方的建议。感谢。
编辑:澄清一下,问题是关于MS SQL。
答案 0 :(得分:1)
这个答案略有“我不会从这里开始”,但这是我做的方式;)
如果您已获得MS SQL Server 2005的标准版或企业版,并且您可以访问SQL Server Integration Services,那么这类事情与数据流有关。
可能比单个insert-with-select语句更多的单个步骤,但它将保存您的暂存,并且它非常直观。此外,您可能已获得使用许可,而且非常简单:)
答案 1 :(得分:0)
接下来,我将从登台表中删除联系人表格中尚未提供的行
似乎暗示ContactGroupMapping
没有匹配Contacts.id
的记录,在这种情况下,您可以省略EXISTS
:
UPDATE [t1]
SET [t1].GroupToBeAssignedTo = [t2].GroupToBeAssignedTo
FROM Contacts [t1]
INNER JOIN
ContactImportStaging [t2]
ON [t1].UserID = [t2].UserID
AND [t1].EmailAddress = [t2].EmailAddress
AND [t2].GUID = @GUID
或者我错过了什么?