获取两个表的差异以及重复记录并存储在 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 的第三个表中的主要内容,如果未能解决你的问题,请参考以下文章

获取两个存储库之间的差异

Azure 表存储查询性能

跨两个数据库导入/导出表的某些列并排除 mysql 中的重复电子邮件

如何获取 Azure 存储帐户日志记录启用状态?

从 Azure Blob 存储中获取记录时在服务器端 (Java) 进行分页

比较不同表的聚合函数