我对 SQL 相当陌生,遇到了如下问题。 我有一个 EMPLOYEE 表,每天都会用最新数据刷新。它有 5 列: 员工 ID、姓名、职位、地点、费率
我想编写一个查询,从 EMPLOYEE 表中进行选择,并在 EMPLOYEE_HISTORY 表中写入包含 Start_Date 和 End_Date 列的记录(如果自昨天以来有任何值发生更改)。
示例:
第一天员工表:
员工ID | 姓名 | 位置 | 地点 | 价格 |
---|---|---|---|---|
1001 | 约翰·多伊 | 经理 | CA | 45 |
1002 | 鲍勃·罗曼 | 分析师 | 德 | 32 |
EMPLOYEE_HISTORY 最初将为空。在 Day1 运行查询后,它应该具有 Start_Date 为 Day1 且 End_Date 为 NULL 的所有记录:
第 1 天的预期 EMPLOYEE_HISTORY 表:
员工ID | 姓名 | 位置 | 地点 | 价格 | 开始_日期 | 结束_日期 |
---|---|---|---|---|---|---|
1001 | 约翰·多伊 | 经理 | CA | 45 | 日期1 | 空 |
1002 | 鲍勃·罗曼 | 分析师 | 德 | 32 | 日期1 | 空 |
第 2 天员工表:
员工ID | 姓名 | 位置 | 地点 | 价格 |
---|---|---|---|---|
1001 | 约翰·多伊 | 经理 | CA | 45 |
1002 | 鲍勃·罗曼 | 分析师 | 德 | 35 |
注意:Bob 的利率已更改
在第 2 天运行查询后,Bob 的较早记录必须是结束日期,并且应插入新记录。
第 2 天的预期 EMPLOYEE_HISTORY 表:
员工ID | 姓名 | 位置 | 地点 | 价格 | 开始_日期 | 结束_日期 |
---|---|---|---|---|---|---|
1001 | 约翰·多伊 | 经理 | CA | 45 | 日期1 | 空 |
1002 | 鲍勃·罗曼 | 分析师 | 德 | 32 | 日期1 | 日期2 |
1002 | 鲍勃·罗曼 | 分析师 | 德 | 35 | 日期2 | 空 |
我知道它应该是一个使用“WHEN NOT MATCHED”子句的 MERGE 语句,但无法完整地表述它。
MERGE INTO EMPLOYEE_HISTORY AS EH
USING EMPLOYEE AS E
ON EH.EmployeeID = E.EmployeeID
WHEN MATCHED AND (EH.Name <> E.Name OR EH.Position <> E.Position OR EH.Location <> E.Location OR EH.Rate <> E.Rate) THEN
UPDATE SET EH.End_Date = CURRENT_DATE
WHEN NOT MATCHED BY TARGET THEN
INSERT (EmployeeID, Name, Position, Location, Rate, Start_Date, End_Date)
VALUES (E.EmployeeID, E.Name, E.Position, E.Location, E.Rate, CURRENT_DATE, NULL)
WHEN NOT MATCHED BY SOURCE THEN
UPDATE SET EH.End_Date = CURRENT_DATE
OUTPUT $action, inserted.EmployeeID, inserted.Name, inserted.Position, inserted.Location, inserted.Rate, inserted.Start_Date, inserted.End_Date;