将变更员工和新员工追加到现有 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