我创建了一个包含列(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的新手,可能会过度思考。
答案 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