我正在跟踪员工,希望拥有一个正在运行的主列表。我有一个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
有人能指出我的类似要求吗?
谢谢!
答案 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
如果需要调整/进一步详细说明,请发表评论。