[英]Update an SQL table based on another table, the result needs to mark the rows missing
我正在跟踪员工,并希望有一个运行中的主列表。 我有一个SAP导出功能,可为我提供当前雇员的列表。 我每个月都要更新主表。 本质上,如果主表包含尚未标记为过期的行,但该行在SAP中不存在,则我想将主表与另一个表合并(该表将仅具有最新SAP导出的结果)导出我希望它将该行标记为过期。 如果SAP导出中的行当前不在主列表中,我希望它添加它。
表格-主清单
Name | Department | Position | Active
Test1 Dept2 Role1 True
Test2 Dept2 Role2 False
Test3 Dept2 Role1 True
表-SAP导出
Name | Department | Position | Active
Test1 Dept2 Role1 True
Test4 Dept2 Role2 True
表-结果(主表)
Name | Department | Position | Active
Test1 Dept2 Role1 True
Test2 Dept2 Role2 False
Test3 Dept2 Role1 False
Test4 Dept2 Role1 True
谁能指出我提出类似要求的方向?
谢谢!
对于一般方法,如果您在主键上进行联接,则可以使用LEFT和INNER Joins来检测匹配和丢失的记录。
如果将表左联接在一起,并在右侧表中查找NULL值,它将告诉您在左表中不存在哪些行。
您可以执行以下操作。 我假设“ Name
”列是您的主键。
将SAP导出插入单独的表(也可以是临时表)。 让我们称之为tempTable。 由于您尚未指定导出文件的外观(是否为CSV / Excel等。因此,我无法详细介绍如何将此表导入SQL数据库)。
根据tempTable中的记录更新主表中记录的状态
UPDATE MasterList设置[Active] ='false'WHERE [名称]不存在(从tempTable中选择[名称])
插入MasterList
不存在的新行
将值插入到MasterList([名称],[部门],[位置],[活动])值(SELECT * FROM tempTable,其中tempTable.Name <> MasterList.Name)
截断tempTable
下面的语句应该大致是您想要的(假设数据库中已经有sap表)。
更新过期的条目
update master_table set is_expired = TRUE where id in (select id from master_table left join sap_table on id where master_table.is_expired = FALSE and sap_table.id IS NULL);
说明:在id上左联接master_table和sap_table,如果联接表的sap表列上的id为null,则将主表中的条目发送到过期。
插入新条目
insert into master_table select (columns you want to insert) from sap_table left join master_table as t2 on id where t2.id IS NULL;
说明:在id上左连接sap_table和master_table,如果id为NULL,则将sap表中的行插入主表中。
这似乎很适合MERGE
:
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20));
MERGE INTO MasterList AS target
USING (SELECT name, department, position, active FROM SAPExport) AS source
ON (target.name = source.name AND target.department = source.department AND target.position = source.position)
WHEN NOT MATCHED THEN
INSERT (name, department, position, active)
VALUES (source.name, source.department, source.position, source.active)
WHEN NOT MATCHED BY SOURCE THEN
UPDATE SET active = 0
OUTPUT $action INTO @SummaryOfChanges
;
实际运行中看一下: SQL Fiddle
请评论是否需要调整。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.