我对SQL Server刚起步(使用ssms)。我需要一些帮助,以便将一个表中的数据插入并组织到多个表中(通过PK / FK相互连接)。
源表具有以下列:
Email, UserName, Phone
这是一个混乱的表,里面有很多重复项:同一封电子邮件,但用户名不同,依此类推。
我的数据表是:
Person
-PersonID(PK,int,不为null)Email
-电子邮件(nvarchar,空),PersonID(FK,整数,不为空)Phone
-电话号码(int,null),PersonID(FK,int,not null)UserName
-用户名(nvarchar,null),PersonID(FK,int,不为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
答案 0 :(得分:0)
游标通常会比较慢,因为它们是逐行运行的。使用基于集合的操作(例如联接)将产生更好的性能。它稍旧一些,但是此article进一步详细说明了游标与set操作相对的含义。我不确定要用于验证匹配项的列以及要添加的数据,但是下面是一个基本示例,您可以根据需要填写这些列。在示例中使用了电子邮件表。对于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))