我是T-SQL的新手,并尝试对从Excel导入SQL Server的一些数据进行一些清理。
我已经进行了批量导入,将原始数据导入到临时表中,现在我想清理它。
我有以下表格
tblRawInput
(我的舞台表):
Name, Name2, Name3, Phonenumber, Group
tblPeople
:
PersonID (IDENTITY), Name, Phonenumber, GroupID
tblGroups
:
GroupID (IDENTITY), Groupname
tblAltNames
:
NameID (IDENTITY), Name, PersonID
查询应该能够将数据拆分到其他表中,但如果已经存在,则不能创建组。
我不知所措。任何人都可以给我指向正确的方向。
当我执行SELECT INTO
时,它会创建多个组的副本。
答案 0 :(得分:0)
您可以使用not exists
子句仅插入新组:
insert into Groups
(GroupName)
select distinct Group
from tblRawInput ri
where not exists
(
select *
from Groups
where g.GroupName = ri.Group
)
在此之后,您可以插入tblPeople
喜欢;
insert tblPeople
(Name, GroupID)
select ri.Name
, g.GroupID
from tblRawInput ri
-- Look up GroupID in the Groups table
join Groups g
on g.GroupName = ri.Group
您可以沿同一行进行备用名称。
答案 1 :(得分:0)
首先,在这种情况下,订单很重要。首先插入到组。
insert into tblGroups
(GroupName)
select Group
from tblRawInput ri
where not exists
(
select *
from tblGroups g
where g.GroupName = ri.Group
)
然后插入人员表
Insert into tblPeople(Name, Phonenumber, GroupID)
Select Name, Phonenumber, GroupID
from tblRawInput ri
join tblGroups g
on g.groupName = ri.group
where not exists
(
select *
from tblPeople p
where p.Name = ri.Name
and p.Phonenumber = ri.Phonenumber
and p.groupId = g.groupid
)
然后获取alt名称
Insert into tblAltNames (Name, Personid)
Select Distinct Name2, PersonID
from tblRawInput ri
join tblPerson p
on p.Name = ri.Name
where not exists
(
select *
from tblAltNames p
where p.Name = ri.Name2
)
当然所有这些都应该包含在一个事务中,一个带有回滚的try catch块是其中一个插入失败。
可能第二个查询shoudl使用输出子句来插入teid而不是连接。你在这里加入并没有什么好处,因为名字不是唯一的。