我的情况是将CSV上传到我的应用程序,并且每行基本上都需要放入数据库。我读了每一行并构建了一个数据表,然后是一个表到一个临时表的SqlBulkCopy。
登台表如下所示:
UserID, GroupID, FirstName, LastName, EmailAddress
我在数据库中有三个其他相关表。联系人表,组表和联系人到组映射表。
Contacts:
ID, UserID, FirstName, LastName, EmailAddress
Groups
ID, UserID, Name, Description
ContactGroupMapping
ID, ContactID, GroupID
ContactGroupMapping表只是将联系人映射到组。希望临时表现在有意义,它保存每个导入的联系人的详细信息以及他们也应该映射到的组。
我的计划是在SqlBulkCopy之后对数据库运行查询,以将数据从登台表移动到Contacts和ContactGroupMapping表。目前,我有一个类似这样的查询:
INSERT INTO Contacts (UserID, FirstName, LastName, EmailAddress)
SELECT DISTINCT [t1].UserID, [t1].EmailAddress, [t1].FirstName, [t1].LastName FROM ContactImportStaging as [t1]
WHERE NOT EXISTS
(
SELECT UserID, EmailAddress, FirstName, LastName FROM Contacts
WHERE UserID = [t1].UserID AND EmailAddress = [t1].EmailAddress AND FirstName = [t1].FirstName AND LastName = [t1].LastName
)
所以,我的问题是,虽然这会将所有不同的联系人插入到我的联系人表中,但我无法将关联的行添加到每个新插入的联系人的映射表中。
唯一的解决方案(可能是因为我吮吸SQL)我能想到的是在contacts表中有一个额外的可为空的字段,用于标识联系人要关联的组并插入它。然后我可以运行第二个查询来选择具有此列中值的所有联系人并插入到映射表中。
有关如何最有效地实现此类事情的任何想法?
感谢。
编辑:详细说明对象模型:有任意数量的联系人和任意数量的组。联系人可以通过ContactGroupMapping表中的条目位于组中。一个联系人可以是任意数量的组。在数据库级别,此模型是三个表联系人,组和 ContactGroupMapping 的关注点。我需要从登台表中移动一行并创建两行;一个在Contacts表中,一个在ContactGroupMapping表中。
答案 0 :(得分:2)
我只是将CSV批量复制到临时数据库表中。如果空间有问题,您可以稍后删除该表。
将CSV复制到StagingTable后,诀窍是将其拆分为其他表。由于现在可以在数据库中引用CSV,因此可以连接其他表以检索新表的ID:
insert into ContactGroupMapping
select cont.ID, grp.ID
from StagingTable stag
inner join Contacts cont on cont.UserID = stag.UserID
inner join Groups grp on grp.GroupID = stag.GroupID
更简单的解决方案是保留原始GroupID和UserID。填充GroupContactMapping将如此简单:
insert into ContactGroupMapping
select UserID, GroupID
from StagingTable stag