![](/img/trans.png)
[英]Selecting data from two tables, inserting it into new table? (SQL / PHP)
[英]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表中的条目将联系人分组。 一个联系人可以分为任意多个组。 在数据库级别,此模型是三个表Contacts , Groups和ContactGroupMapping的关注点 。 我需要从登台表中移出一行并创建两行; 一个在“联系人”表中,另一个在“ 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.