清理T-SQL表

时间:2015-02-04 19:52:15

标签: sql-server database tsql

我是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时,它会创建多个组的副本。

2 个答案:

答案 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而不是连接。你在这里加入并没有什么好处,因为名字不是唯一的。