2

我创建了一个包含列 (pk) emp_id 和 emp_name 的员工表。我有一个包含员工编号和员工姓名字段的日志表。

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

我尝试只填充员工编号,然后更新找到的名称,但我收到错误子查询返回超过 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 的新手,可能会过度思考这个问题。

4

2 回答 2

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,以及为空的名称,它们必须首先被清理,即减少为一组唯一的 (id,name) 组合。如何做到这一点取决于源表中的各种垃圾(例如空值、零长度字符串、前导/尾随空格、拼写错误和更正、完全重复等)。

PS 用适当的列名替换您的源表。

于 2013-07-31T18:03:42.837 回答
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  
于 2013-07-31T20:56:44.693 回答