使用不同的值更新列

时间:2013-07-31 17:44:11

标签: sql-server sql-server-2008 tsql

我创建了一个包含列(pk)emp_id和emp_name的员工表。我有一个日志表,其中包含Employee Number和Employee Name字段。

我正在尝试使用日志中的记录填充我的表,其中emp_id是唯一标识符。但是,日志中的数据包含重复的员工编号,有时还包含缺少的员工姓名。

我尝试使用Employee编号填充,然后更新找到的名称,但是我收到错误Subquery返回的值超过1。当子查询遵循=,!=等

时,不允许这样做
SET IDENTITY_INSERT tblEmployee ON    
    Insert into tblEmployee (emp_id)        
    Select  Distinct [Employee Number]        
    From       
    wrkLogs        
    SET IDENTITY_INSERT tblEmployee OFF   

    Update tblEmployee        
    Set emp_name = (Select [Employee Name] 
                    From wrkLogs
                    Where emp_id= [Employee Number] AND LEN ([Employee Name] ) >1 
                    )        
    WHERE EXISTS (Select [Template Name] 
                    From wrkLogs
                    Where emp_id= [Employee Number ]AND LEN ([Employee Name] ) > 1  ) ;

任何人都可以给我一个更好的方法来填充表格,其中包含所有不同的员工编号和找到他们的员工姓名。我认为问题是数据有时会有员工编号,并附有一个空白的员工姓名,但我仍然希望表中记录这些记录。我是sql server的新手,可能会过度思考。

2 个答案:

答案 0 :(得分:0)

这将从源表中获取id | name组合,其中id仅出现一次:

 select id, name from source
 where name is not null and name <> ''  -- use trim() too if appropriate
 group by id having count(name) = 1

并假设您的目标表为空,您只需插入这些行。

然后,您可以从源表中删除那些插入的行。

在源表中剩下的是多次出现的ID,以及null的名称,必须首先清除它们,即减少为一组唯一(id,name)组合。如何做到这将取决于源表中的垃圾种类(例如空值,零长度字符串,前导/尾随空格,拼写错误和更正,完全重复等)。

P.S。替换源表的相应列名。

答案 1 :(得分:0)

要查找不同的员工编号和可用名称,您可以使用ROW_NUMBER排名功能

SET IDENTITY_INSERT dbo.employee ON
;WITH cte AS
 (      
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY [Employee Number] ORDER BY [Employee Name] DESC) AS rn
  FROM dbo.wrkLogs
  WHERE LEN([Employee Name]) >= 1
  )  
  INSERT dbo.employee(emp_id, emp_name)
  SELECT [Employee Number], [Employee Name]
  FROM cte
  WHERE rn = 1
SET IDENTITY_INSERT dbo.employee OFF