首页 > 解决方案 > SQL Server 中是否有一种方法可以显示两个具有相同布局并共享一些公共数据的表之间的字段差异

问题描述

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

我已经尝试过使用 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 材料,并能够展示它们的不同之处。作为参考,这些表中有大约 300 列,因此列出每一列可能有点麻烦。

样本数据:

在此处输入图像描述

标签: sqlsql-serversql-except

解决方案


您可以从每个组织表中选择常用材料,并添加一个组织伪列。然后只需将这两个查询合并在一起并对它们进行排序,使行一个接一个地排列。

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

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


推荐阅读