小编典典

SQL将数据从登台表插入到其他两个表

sql

我遇到了一种情况,其中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表中的条目将联系人分组。一个联系人可以处于任意数量的组中。在数据库级别,此模型是三个表
ContactsGroupsContactGroupMapping的关注点
。我需要从登台表中移出一行并创建两行;一个在“联系人”表中,另一个在“ ContactGroupMapping”表中。


阅读 173

收藏
2021-05-16

共1个答案

小编典典

我只是将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
2021-05-16