如何从每一行插入到多个表中
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))
【讨论】:
以上是关于如何从每一行插入到多个表中的主要内容,如果未能解决你的问题,请参考以下文章