SQL 服务器中是否有一种方法可以显示具有相同布局并共享一些公共数据的两个表之间的字段差异

Is there a way in SQL Server to show the differences in fields between two tables that have an identical layout and share some common data

我在两个数据库(两个不同的组织)上有两个表,它们具有相同的布局 - 它们是 material 主表。一个列出了大约 600k materials,一个大约有 100k - 它们共享大约 35k 个相同的 materials。问题是一个组织可能列出了与另一个组织不同的属性,即一个组织的价格可能不同,或者一个组织与另一个组织的季节可能不同。我正在尝试找到一种可能并排显示的方法,其中一个组织中的 material 与另一个组织中的 material 之间存在差异。到目前为止,我只提出了下面的代码——它使用的是 EXCEPT,但它似乎只能 return 来自一行或另一行的数据,而我试图同时查看两者。有什么想法吗?

我已经按照上面提到的使用 EXCEPT 语句进行了尝试,但只得到了结果的一侧。

select * from pdx_sap_user..vw_mm_material 
where material in (select material

from pdx_sap_user..vw_mm_material 

where material  in (select material from usts_user..vw_mm_material)) -- used to get to the shared materials

EXCEPT 

select * from usts_user..vw_mm_material

我想获得共享的 35k materials 并能够显示它们的不同之处。作为参考,这些表中大约有 300 列,因此列出每一列可能有点麻烦。

示例数据:

您可以 select 每个组织表中的公共 material 并添加一个组织伪列。然后将两个查询合并在一起并对它们进行排序,使行一个接一个地排列。

DECLARE @og1Mats TABLE (
    Material INT, Description NVARCHAR(50), Color NVARCHAR(50), MSRP INT
)

DECLARE @og2Mats TABLE (
    Material INT, Description NVARCHAR(50), Color NVARCHAR(50), MSRP INT
)

INSERT INTO @og1Mats VALUES (11040, 'World Cup', 'black', 100),(11050, 'Fabric', 'yellow', 10),(11060, 'Steel', 'gray', 50);
INSERT INTO @og2Mats VALUES (11040, 'World Cup', 'black', 120),(11030, 'Concrete', 'gray', 10),(11060, 'Steel', 'black', 55);

WITH common AS (
    SELECT o1.Material FROM @og1Mats o1
    INNER JOIN @og2Mats o2 ON o1.Material=o2.Material
)
SELECT o1.*, 1 as organization
FROM @og1Mats o1
INNER JOIN common c ON c.Material=o1.Material
UNION ALL 
SELECT o2.*, 2 as organization
FROM @og2Mats o2 
INNER JOIN common c ON c.Material=o2.Material
ORDER BY
    Material
    , organization

这将为您提供类似于示例数据的输出,其中行按 material 和组织分组。然后,您可以使用它手动或与其他工具比较数据。

DECLARE @og1Mats TABLE (
Material INT, Description NVARCHAR(50), Color NVARCHAR(50), MSRP INT
)

DECLARE @og2Mats TABLE (
Material INT, Description NVARCHAR(50), Color NVARCHAR(50), MSRP INT
)

INSERT INTO @og1Mats VALUES (11040, 'World Cup', 'black', 100)
,(11050, 'Fabric', 'yellow', 10),(11060, 'Steel', 'gray', 50);

INSERT INTO @og2Mats VALUES (11040, 'World Cup', 'black', 120)
,(11030, 'Concrete', 'gray', 10),(11060, 'Steel', 'black', 55);

;with CTE as
(
select * from @og1Mats
except
select * from @og2Mats
),
CTE1 as
(
select * from @og2Mats
except
select * from @og1Mats
)

select * from
(
select * from CTE
union all
select * from CTE1
)t4
order by Material

无论如何都应该避免使用 select *