如何从每一行插入到多个表中

Posted

技术标签:

【中文标题】如何从每一行插入到多个表中【英文标题】:How to insert from each row into to multiple tables 【发布时间】:2018-12-19 17:12:11 【问题描述】:

我对 SQL Server 很陌生(使用 ssms)。我需要一些帮助才能将数据从一个表插入和组织到多个表中(通过 PK/FK 相互连接)。

源表有以下列:

Email, UserName, Phone

这是一张乱七八糟的表格,有很多重复:相同的电子邮件,不同的用户名等等..

我的数据表是:

    Person - PersonID(PK, int, not null) Email - 电子邮件 (nvarchar, null) , PersonID (FK, int, not null) Phone - PhoneNumber (int, null) , PersonID (FK, int, not null) UserName - UserName (nvarchar, null) , PersonID (FK, int, not null)

对于源表中的每一行,我需要检查该人是否已经存在(通过电子邮件);如果确实存在,我需要添加新数据(如果有),否则我需要创建一个新人并添加数据。

我在这里搜索了一些解决方案并找到了使用 CURSOR 的建议。 我试过了,但是执行起来需要很长时间(几个小时……而且还在继续)

感谢您的帮助!

示例: 来自>

EMAIL | USERNAME | PHONE
------------------------
a@a.a | john | 956165
b@b.b | smith | 123456
c@c.c | bob | 654321
d@d.d | mike | 986514
a@a.a | dan | 658732
e@e.e | dave | 147258
f@f.f | harry | 951962
b@b.b | emmy | 456789
g@g.g | kelly | 789466
h@h.h | kelly | 258369
a@a.a | ana | 852369

到>

EMAIL | PERSONID
----------------
a@a.a | 1
b@b.b | 2
c@c.c | 3
d@d.d | 4
e@e.e | 5
f@f.f | 6
g@g.g | 7
h@h.h | 8

USERNAME | PERSONID
-------------------
john | 1
smith | 2
bob | 3
mike | 4
dan | 1
dave | 5
harry | 6
emmy | 2
kelly | 7
kelly | 8
ana | 1

PHONE | PERSONID
----------------
956165 | 1
123456 | 2
654321 | 3
986514 | 4
658732 | 1
147258 | 5
951962 | 6
456789 | 2
789466 | 7
258369 | 8
852369 | 1

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

游标通常会较慢,因为它们是逐行操作的。使用基于集合的操作(例如连接)将产生更好的性能。它有点旧,但是这个article 进一步详细说明了游标的含义,而不是集合操作。我不完全确定您要使用哪些列来验证匹配项以及要添加哪些数据,但下面是一个基本示例,您可以根据需要填写这些列。示例中使用了 Email 表。对于UPDATE,这将根据源表中的相应行更新现有行。作为INNER JOIN,只有两边都匹配的行会受到影响。在第二个语句中,这是一个INSERT,仅使用源表中不存在于电子邮件表中的行。使用MERGE 语句也可以实现相同的功能,但是这样做存在许多问题,包括死锁和密钥违规问题。

更新现有行:

UPDATE E
SET E.ColumnA = SRC.ColumnA,
E.ColumnB = SRC.ColumnB
FROM YourDatabase.YourSchema.Email E
INNER JOIN YourDatabase.YourSchema.SourceTable SRC
ON E.Email = SRC.Email

添加新行:

INSERT INTO YourDatabase.YourSchema.Email (ColumnA, ColumnB)
SELECT 
ColumnA, 
ColumnB
FROM YourDatabase.YourSchema.SourceTable 
WHERE EMAIL NOT IN ((SELECT EMAIL FROM YourDatabase.YourSchema.Email))

【讨论】:

以上是关于如何从每一行插入到多个表中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SSIS 将多个表中的数据插入到多个表中?

如何使用 django orm 将数据插入到多个表中

如何一次将多个值插入到 postgres 表中?

如何一次将数据插入和更新到 EF 多个表中

如何防止将重复数据插入到值为多个的 SQL Server 表中

雪花我们如何遍历临时表的每一行并将其值插入到另一个表中,其中每个字段的值都是单行?