我有一張表(表 1),其中列出了員工和有關他們的資料點。填充表 1 的資料會定期更改并添加到其源系統中,然后通過 CSV 加載到另一個表(表 2)中。
如果某個員工的資料發生更改,我想更新表 1 中該員工記錄中的一列以標記它已經更改,然后在表中添加一個新行,其中包含員工更改的資料以及表 2 中的任何新員工表 1 中尚不存在。
例子:
表格1:
Status | ID | Name | Department | Title
Active 767 John Tech Analyst
Active 789 Alex Tech Courier
表2:
Status | ID | Name | Department | Title
Active 767 John Tech Director -- the title changed for this employee
Active 789 Alex Tech Courier
表 1 的期望輸出:
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 條件的行作為單獨的行附加到表中,并加入所有符合它的行。但是,資料已更改的員工不會被添加到表中,只是狀態正在更新。我想添加更改了他們的任何部門、頭銜等的員工以及 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]
uj5u.com熱心網友回復:
您需要 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
單擊此 DBFiddle以查看它的作業原理
結果是
| 地位 | ID | 姓名 | 部 | 標題 |
|---|---|---|---|---|
| 積極的 | 767 | 約翰 | 科技 | 導向器 |
| 改變了 | 767 | 約翰 | 科技 | 分析家 |
| 積極的 | 787 | 亞歷克斯 | 科技 | 導游 |
| 積極的 | 800 | 皮卡德 | 科技 | 隊長 |
根據評論中的要求編輯更改
當某人更改不止一次時,原始查詢會不止一次插入他的新位置。這可以通過對更改進行分組來解決。
看到這個更新的 DBFiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/467836.html
上一篇:希望SQL陳述句回傳所有列
下一篇:將兩個字串轉換并合并為表格
