将变更员工和新员工追加到现有 Table
Append Changed and New Employees to Existing Table
我有一个 table (Table 1),这是一个员工列表和关于他们的数据点。填充 Table 1 的数据会定期更改并添加到其源系统中,然后通过 CSV 加载到另一个 table (Table 2)。
如果某个员工的数据发生变化,我想更新 Table 1 中该员工记录中的一列以标记它已更改,然后将新行添加到 table随着员工更改数据以及 Table 2 中不存在于 Table 1.
中的任何新员工
示例:
Table1:
Status | ID | Name | Department | Title
Active 767 John Tech Analyst
Active 789 Alex Tech Courier
Table2:
Status | ID | Name | Department | Title
Active 767 John Tech Director -- the title changed for this employee
Active 789 Alex Tech Courier
Table1 的期望输出:
Status | ID | Name | Department | Title
Active 767 John Tech Director -- Updated Employee data from Table2
Changed 767 John Tech Analyst -- Old Employee Data from Table1
Active 789 Alex Tech Courier
使用下面的查询,我试图通过外部联接更新 Table1,理论上应该将任何不符合 where 条件的行作为单独的行附加到 table并加入所有符合它的行。但是,数据更改的员工不会添加到 table,只会更新状态。我想添加已更改其任何部门、职位等的员工以及 Table1
中尚不存在的任何新员工
如何确保数据已更改的员工在加入未更改的员工时被添加为新行。
查询:
UPDATE [Database].[dbo].[CBC_legacy]
SET
[Position Status] =[CBC].[Position Status]
,[Employee ID] = [CBC].[Employee ID]
,[Full Legal Name] = [CBC].[Full Legal Name]
,[Hire/Rehire Date] = [CBC].[Hire/Rehire Date]
,[Annual Salary] = [CBC].[Annual Salary]
,[Job Title] = [CBC].[Job Title]
,[Kamsa Job Code] = [CBC].[Kamsa Job Code]
,[Home Department] = [CBC].[Home Department]
,[Worked In Country] = [CBC].[Worked In Country]
,[Budget ID] = [CBC].[Budget ID]
,[Work Location] = [CBC].[Work Location]
,[Regular Pay Currency] = [CBC].[Regular Pay Currency]
FROM [Database].[dbo].[CBC_legacy] AS CBCL
FULL OUTER JOIN [Database].[dbo].[CBC_data] CBC
ON CBCL.[Employee ID] = CBC.[Employee ID]
WHERE [CBC].[Employee ID] = [CBCL].[Employee ID]
AND [CBC].[Job Title] = [CBCL].[Job Title]
AND [CBC].[Home Department] = [CBCL].[Home Department]
AND [CBC].[Annual Salary] = [CBCL].[Annual Salary]
SELECT * FROM [Database].[dbo].[CBC_legacy] ORDER BY [Full Legal Name]
您需要 2 个查询,一个用于更新,一个用于插入。
我假设在这个例子中只有 Department 和 Title 可以改变,如果更多的列可以改变而不只是将它们添加到 where 子句
-- update status
update t1
set t1.Status = 'Changed'
from table1 t1
inner join table2 t2 on t1.id = t2.id
where (t2.Department <> t1.Department
or
t2.Title <> t1.Title
)
-- insert new row from table2
insert into table1
select t2.Status, t2.Id, t2.Name, t2.Department, t2.Title
from table2 t2
left join table1 t1 on t2.id = t1.id
and ( t2.Department <> t1.Department
or
t2.Title <> t1.Title
)
where not exists ( select 1
from table1 t1
where t1.id = t2.id
and t1.status = t2.status
and t1.name = t2.name
and t1.department = t2.department
)
group by t2.Status, t2.Id, t2.Name, t2.Department, t2.Title
select * from table1 order by id, status
单击 this DBFiddle 以查看它是否正常工作
结果是
Status
id
name
department
title
Active
767
John
Tech
Director
Changed
767
John
Tech
Analist
Active
787
Alex
Tech
Courier
Active
800
Picard
Tech
Captain
根据评论中的要求编辑更改
当某人改变不止一次时,原始查询不止一次插入他的新职位。这可以通过对更改进行分组来解决。
看到这个Updated DBFiddle
我有一个 table (Table 1),这是一个员工列表和关于他们的数据点。填充 Table 1 的数据会定期更改并添加到其源系统中,然后通过 CSV 加载到另一个 table (Table 2)。
如果某个员工的数据发生变化,我想更新 Table 1 中该员工记录中的一列以标记它已更改,然后将新行添加到 table随着员工更改数据以及 Table 2 中不存在于 Table 1.
中的任何新员工示例:
Table1:
Status | ID | Name | Department | Title
Active 767 John Tech Analyst
Active 789 Alex Tech Courier
Table2:
Status | ID | Name | Department | Title
Active 767 John Tech Director -- the title changed for this employee
Active 789 Alex Tech Courier
Table1 的期望输出:
Status | ID | Name | Department | Title
Active 767 John Tech Director -- Updated Employee data from Table2
Changed 767 John Tech Analyst -- Old Employee Data from Table1
Active 789 Alex Tech Courier
使用下面的查询,我试图通过外部联接更新 Table1,理论上应该将任何不符合 where 条件的行作为单独的行附加到 table并加入所有符合它的行。但是,数据更改的员工不会添加到 table,只会更新状态。我想添加已更改其任何部门、职位等的员工以及 Table1
中尚不存在的任何新员工如何确保数据已更改的员工在加入未更改的员工时被添加为新行。
查询:
UPDATE [Database].[dbo].[CBC_legacy]
SET
[Position Status] =[CBC].[Position Status]
,[Employee ID] = [CBC].[Employee ID]
,[Full Legal Name] = [CBC].[Full Legal Name]
,[Hire/Rehire Date] = [CBC].[Hire/Rehire Date]
,[Annual Salary] = [CBC].[Annual Salary]
,[Job Title] = [CBC].[Job Title]
,[Kamsa Job Code] = [CBC].[Kamsa Job Code]
,[Home Department] = [CBC].[Home Department]
,[Worked In Country] = [CBC].[Worked In Country]
,[Budget ID] = [CBC].[Budget ID]
,[Work Location] = [CBC].[Work Location]
,[Regular Pay Currency] = [CBC].[Regular Pay Currency]
FROM [Database].[dbo].[CBC_legacy] AS CBCL
FULL OUTER JOIN [Database].[dbo].[CBC_data] CBC
ON CBCL.[Employee ID] = CBC.[Employee ID]
WHERE [CBC].[Employee ID] = [CBCL].[Employee ID]
AND [CBC].[Job Title] = [CBCL].[Job Title]
AND [CBC].[Home Department] = [CBCL].[Home Department]
AND [CBC].[Annual Salary] = [CBCL].[Annual Salary]
SELECT * FROM [Database].[dbo].[CBC_legacy] ORDER BY [Full Legal Name]
您需要 2 个查询,一个用于更新,一个用于插入。
我假设在这个例子中只有 Department 和 Title 可以改变,如果更多的列可以改变而不只是将它们添加到 where 子句
-- update status
update t1
set t1.Status = 'Changed'
from table1 t1
inner join table2 t2 on t1.id = t2.id
where (t2.Department <> t1.Department
or
t2.Title <> t1.Title
)
-- insert new row from table2
insert into table1
select t2.Status, t2.Id, t2.Name, t2.Department, t2.Title
from table2 t2
left join table1 t1 on t2.id = t1.id
and ( t2.Department <> t1.Department
or
t2.Title <> t1.Title
)
where not exists ( select 1
from table1 t1
where t1.id = t2.id
and t1.status = t2.status
and t1.name = t2.name
and t1.department = t2.department
)
group by t2.Status, t2.Id, t2.Name, t2.Department, t2.Title
select * from table1 order by id, status
单击 this DBFiddle 以查看它是否正常工作
结果是
Status | id | name | department | title |
---|---|---|---|---|
Active | 767 | John | Tech | Director |
Changed | 767 | John | Tech | Analist |
Active | 787 | Alex | Tech | Courier |
Active | 800 | Picard | Tech | Captain |
根据评论中的要求编辑更改
当某人改变不止一次时,原始查询不止一次插入他的新职位。这可以通过对更改进行分组来解决。
看到这个Updated DBFiddle