跨数据库和层比较 SQL Server 中的两个表

Posted

技术标签:

【中文标题】跨数据库和层比较 SQL Server 中的两个表【英文标题】:Comparing two tables in SQL Server across databases and layers 【发布时间】:2017-10-27 07:53:07 【问题描述】:

我正在尝试比较来自我的 DM 层但来自两个不同数据库(旧数据库和新数据库,用于数据一致性/比较数据分析)的两个表。为了能够比较这两个表,我需要通过 EDW 和 MDM/Maps 层加入。我需要比较列和行以匹配内容,并且我希望以某种方式输出不匹配的内容。您将如何处理?

到目前为止,我有这个完全外连接。我正在考虑使用这种比较不平等的方式:http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx

但我似乎无法让我的 UNION ALL 工作而不是 FULL OUTER JOIN。您将如何进行?您会使用 UNION ALL 吗?

select * from (
select dm.*, mdm.ProductionSystem, mdm.SchoolIdent
from DM_OLD.dbo.DimSchool dm
inner join EDW_OLD.dbo.School edw on dm.EdwSchoolId = edw.SchoolID
inner join MDM_OLD.dbo.School mdm on edw.SYS_BusinessKeyFK = mdm.SYS_BusinessKeyID
) a
full outer join
(
select dm.*, maps.ProductionSystem, maps.SchoolIdent
from dm.dbo.DimSchool dm
inner join edw.dbo.School edw on dm.EdwSchoolId = edw.SchoolID
inner join edw.maps.School maps on edw.SYS_BusinessKeyFK = maps.SYS_BusinessKeyID
) b ON a.ProductionSystem = b.ProductionSystem AND a.SchoolIdent = b.SchoolIdent

【问题讨论】:

我最近遇到了类似的任务。我决定使用 SSIS 并创建一个 C# 源组件,它负责在内存中进行比较并输出不同的字段... 【参考方案1】:

此查询向您显示在 OLD 中存在而在 NEW 中缺失的所有行:

select dm.*, mdm.ProductionSystem, mdm.SchoolIdent
from DM_OLD.dbo.DimSchool dm
inner join EDW_OLD.dbo.School edw on dm.EdwSchoolId = edw.SchoolID
inner join MDM_OLD.dbo.School mdm on edw.SYS_BusinessKeyFK = mdm.SYS_BusinessKeyID

except

select dm.*, maps.ProductionSystem, maps.SchoolIdent
from dm.dbo.DimSchool dm
inner join edw.dbo.School edw on dm.EdwSchoolId = edw.SchoolID
inner join edw.maps.School maps on edw.SYS_BusinessKeyFK = maps.SYS_BusinessKeyID

这将向您展示您的新品和旧款:

select dm.*, maps.ProductionSystem, maps.SchoolIdent
from dm.dbo.DimSchool dm
inner join edw.dbo.School edw on dm.EdwSchoolId = edw.SchoolID
inner join edw.maps.School maps on edw.SYS_BusinessKeyFK = maps.SYS_BusinessKeyID

except

select dm.*, mdm.ProductionSystem, mdm.SchoolIdent
from DM_OLD.dbo.DimSchool dm
inner join EDW_OLD.dbo.School edw on dm.EdwSchoolId = edw.SchoolID
inner join MDM_OLD.dbo.School mdm on edw.SYS_BusinessKeyFK = mdm.SYS_BusinessKeyID

【讨论】:

@sepudic 然后我只需要以某种方式 UNION ALL? 您的目标是“不惜一切代价使用联合”还是比较两张表? @sepucic 只有当它是更智能的解决方案时。我想测试旧数据库和新数据库的表中不同行中的内容是否匹配。 你试过我的代码了吗?如果您有 tbl1 与行 (1,2,3) 和 tbl2 与 (1,2,4) 它将显示两行,因为它们是不同的。如果两个表都只包含 (1,2,3) 它什么都不会返回 运行您的代码给我:“消息 205,级别 16,状态 1,第 33 行所有使用 UNION、INTERSECT 或 EXCEPT 运算符组合的查询必须在其目标列表中具有相同数量的表达式。”

以上是关于跨数据库和层比较 SQL Server 中的两个表的主要内容,如果未能解决你的问题,请参考以下文章

如何比较两个表的列并将值插入到基于 SQL Server 中存储过程中的比较的新表中

SQL Server中 两个不同的数据库中的两张表如何关联?

SQL SERVER 比较两个数据库中表和字段的差异

为啥 SQL Server 2019 与 Azure SQL 数据库中的外部表语法不同? `

SQL Server - 使用 PIVOT 查询比较 2 个表中的字段

sql如何比较两个表数据是不是一致