繁体   English   中英

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

[英]SQL Inserting data from staging table to two other tables

我有一种情况,其中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)是在联系人表中有一个额外的可空字段,用于标识联系人将要关联的组并插入该字段。 然后,我可以运行第二个查询以选择此列中具有值的所有联系人,并将其插入到映射表中。

关于如何最有效地实现这种事情的任何想法?

谢谢。

编辑:详细说明对象模型:有任意数量的联系人和任意数量的组。 可以通过ContactGroupMapping表中的条目将联系人分组。 一个联系人可以分为任意多个组。 在数据库级别,此模型是三个表ContactsGroupsContactGroupMapping的关注点 我需要从登台表中移出一行并创建两行; 一个在“联系人”表中,另一个在“ ContactGroupMapping”表中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM