繁体   English   中英

更新基于另一个表的SQL表,结果需要标记缺少的行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM