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

时间:2015-01-14 17:47:42

标签: sql sql-server

我正在跟踪员工,希望拥有一个正在运行的主列表。我有一个SAP导出,它提供了当前员工的列表。每个月我都想更新我的主表。基本上我想将我的主表与另一个表组合在一起(如果主表包含尚未标记为已过期的行,则该表将仅包含最新SAP导出的结果)但该行不存在于SAP中export我希望它将该行标记为已过期。如果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

有人能指出我的类似要求吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

对于一般方法,如果您加入主键,则可以使用LEFT和INNER联接来检测匹配和缺失记录。

如果你将表连接在一起,并在右表中查找NULL值,它将告诉你LEFT表中不存在哪些行。

答案 1 :(得分:0)

您可以执行以下操作。我假设列Name是您的主键。

  • 将SAP导出插入单独的表(这也可以是临时表)。让我们称之为tempTable。由于您尚未指定导出文件的外观(无论是CSV / Excel等),我都不能详细介绍如何将此表导入SQL数据库。

  • 根据tempTable中的记录

    更新主表中记录的状态

    UPDATE MasterList Set [Active] ='false'WHERE [Name] NOT IN(SELECT [Name] from tempTable)

  • 插入MasterList

    中不存在的新行

    INSERT INTO MasterList([Name],[Department],[Position],[Active])值(SELECT * FROM tempTable WHERE tempTable.Name<> MasterList.Name)

  • 截断tempTable

答案 2 :(得分:0)

以下陈述应该大致是您想要的(假设您已经在数据库中使用了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);

说明:如果在连接表的sap表列上id为null,则将id加入master_table和sap_table,然后将master表中的条目发送到过期。

插入新条目

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表中的行插入到主表中。

答案 3 :(得分:0)

这似乎适用于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

如果需要调整/进一步详细说明,请发表评论。