获取两个表的差异以及重复记录并存储在 Azure SQL DB 的第三个表中
Posted
技术标签:
【中文标题】获取两个表的差异以及重复记录并存储在 Azure SQL DB 的第三个表中【英文标题】:Get the Difference of two tables along with duplicate records and store in 3rd table in Azure SQL DB 【发布时间】:2021-11-12 22:20:40 【问题描述】:我们正在使用 Azure SQL 数据库。我们有 2 个包含重复行的相似表,我想获取这些表之间的差异并将其存储在第三个表中,并且还应加载重复行。
如果我使用EXCEPT
,它只会加载唯一的行。
如何使用 SQL 命令对此进行评估?我不想使用存储过程来获取结果。
这是一个问题的示例
输入表:
表A
AppName Creation Time Completion Time Status
--------------------------------------------------
App A 8/8/2020 8/9/2020 Completed
App A 8/8/2020 8/9/2020 Completed
App B 8/8/2020 8/9/2020 Completed
App B 8/8/2020 8/9/2020 Completed
App C 8/9/2020 8/10/2020 Completed
App C 8/9/2020 8/10/2020 Completed
App D 8/10/2020 8/11/2020 Completed
表 B
AppName Creation Time Completion Time Status
--------------------------------------------------
App B 8/8/2020 8/9/2020 Completed
App B 8/8/2020 8/9/2020 Completed
App C 8/9/2020 8/10/2020 Completed
App C 8/9/2020 8/10/2020 Completed
App D 8/10/2020 8/11/2020 Completed
App E 8/10/2020 8/11/2020 Completed
App E 8/10/2020 8/11/2020 Completed
App F 8/11/2020 8/12/2020 Completed
App F 8/11/2020 8/12/2020 Completed
预期输出:
表 B 减去 A:
AppName Creation Time Completion Time Status
---------------------------------------------------
App E 8/10/2020 8/11/2020 Completed
App E 8/10/2020 8/11/2020 Completed
App F 8/11/2020 8/12/2020 Completed
App F 8/11/2020 8/12/2020 Completed
表 A 减去 B:
AppName Creation Time Completion Time Status
---------------------------------------------------
App A 8/8/2020 8/9/2020 Completed
App A 8/8/2020 8/9/2020 Completed
【问题讨论】:
您的以 time 命名的列似乎是日期,而不是 次? 【参考方案1】:Azure sql 支持 CTE 函数,使用该函数并排除匹配记录。
;with cte_excl
As (
Select distinct a.appname
From tableA a
Join tableB b on a.appname = b.appname
)
Select a.*
From ( select * from tableA union all select * from tableB )a
Left Join excl e on a.appname=e.appname
Where e.appname is null
【讨论】:
您好,谢谢,它也可以...【参考方案2】:我认为您追求的是以下内容 - 将 A 与 B 和 B 与 A 进行比较,获取不存在的行,然后合并结果:
select *
from ta
where not exists (
select * from tb
where tb.appname=ta.appname
and tb.creation=ta.creation
and tb.completion=ta.completion
and tb.status=ta.status
)
union all
select *
from tb
where not exists (
select * from ta
where ta.appname=tb.appname
and ta.creation=tb.creation
and ta.completion=tb.completion
and ta.status=tb.status
)
See Demo DB<>Fiddle
【讨论】:
我对 TB-TA 感兴趣,但 Not Exists 或 Not In 也返回我在语句 SELECT * FROM TB where not exists (select * from TA where TA.AppId = TB.AppId ) 对不起,它工作正常,它也适用于“Not In”...这是我使用的语句... SELECT * FROM TA where AppId not in(从 TB 中选择 JobId)谢谢 @SaurabhMehta 避免使用NOT IN
,因为可空列存在问题,最好使用NOT EXISTS
【参考方案3】:
我使用了上面 Stu 帖子提供的数据和表格脚本。以上所有答案都可以正常工作并为您提供解决方案。
我只考虑了 Appname 来发现这里的差异。
create table ta (appname varchar(10), creation date, completion date, status varchar(10));
create table tb (appname varchar(10), creation date, completion date, status varchar(10));
insert into ta values
('App A', '8/08/2020', '8/09/2020', 'Completed'),
('App A', '8/08/2020', '8/09/2020', 'Completed'),
('App B', '8/08/2020', '8/09/2020', 'Completed'),
('App B', '8/08/2020', '8/09/2020', 'Completed'),
('App C', '8/09/2020', '8/10/2020', 'Completed'),
('App C', '8/09/2020', '8/10/2020', 'Completed'),
('App D', '8/10/2020', '8/11/2020', 'Completed');
insert into tb values
('App B','8/08/2020','8/09/2020','Completed'),
('App B','8/08/2020','8/09/2020','Completed'),
('App C','8/09/2020','8/10/2020','Completed'),
('App C','8/09/2020','8/10/2020','Completed'),
('App D','8/10/2020','8/11/2020','Completed'),
('App E','8/10/2020','8/11/2020','Completed'),
('App E','8/10/2020','8/11/2020','Completed'),
('App F','8/11/2020','8/12/2020','Completed'),
('App F','8/11/2020','8/12/2020','Completed');
答案:
Select * from ta
where ta.appname not in ( Select appname from tb)
UNION ALL
Select * from tb
where tb.appname not in ( Select appname from ta)
如果您需要单独的结果,请删除 UNION ALL。
【讨论】:
@SaurabhMehta 请看一看。以上答案也提供了所需的输出。我还添加了一个认为 App name 列可用于获取结果。以上是关于获取两个表的差异以及重复记录并存储在 Azure SQL DB 的第三个表中的主要内容,如果未能解决你的问题,请参考以下文章
跨两个数据库导入/导出表的某些列并排除 mysql 中的重复电子邮件