【问题标题】:Two databases with same tables and column names, How to pull out one column with similar data while all the other columns showing the differences?具有相同表和列名的两个数据库,如何提取具有相似数据的一列而所有其他列显示差异?
【发布时间】:2018-09-05 16:45:12
【问题描述】:

我有 2 个名为 'OK''TX' 的数据库,它们具有名为 'E_Model' 的同一个表和如下列: 'Product_ID'、'Description'、'Warranty'和'Category' 我想拥有两个表都有的产品 ID 列表,并且想同时知道所有其他列的差异。

期望的结果应该是这样的:

**'*Database' 'Product_ID' , 'Description', 'Warranty'  'Category'***
OK           LB9456        COFFEE 436      NULL          10      
TX           LB9456         TOASTER 956      1           12
OK           QR3300         APPLE  31        3           15
TX           QR3300         ORANGE 45        5           20

我尝试运行以下查询:

SELECT  Product_ID
FROM  OKSV..E_MODEL
INTERSECT
SELECT  Product_ID
FROM  TXSV..E_MODEL
union all
SELECT  Product_ID
FROM  TXSV..E_MODEL
INTERSECT
SELECT  Product_ID
FROM  OKSV..E_MODEL

我确实在不同数据库的两个表中获得了类似 Product_ID 的列表。但是当我使用以下查询时:

SELECT  Product_ID, Description, Warranty, Category
FROM  OKSV..E_MODEL
INTERSECT
SELECT  Product_ID,Description, Warranty, Category
FROM  TXSV..E_MODEL
union all
SELECT  Product_ID,Description, Warranty, Category
FROM  TXSV..E_MODEL
INTERSECT
SELECT  Product_ID
FROM  OKSV..E_MODEL

它只是向我显示了一个不同的列表。基本上,我想知道两个表中类似产品 ID 的描述、类别和保修的差异。 我这样做是为了清理数据。我是新手,请帮忙,因为我现在正在一件一件地做这件事,这将花费很多时间。

【问题讨论】:

  • 我重写了我的答案以符合您明确的规范。
  • 我很感激,但没有奏效!
  • 怎么没用?它是否给出了错误,或者返回的数据与您的预期不符?可以帮助您获得更好答案的一件事是充分说明当有人提供无效的建议时某事是如何失败的。样本数据也很有帮助(不一定是实时数据)。祝你好运,得到有用的答案。
  • 另外,StackOverflow 建议您阅读How to ask for help
  • Msg 102,级别 15,状态 1,第 15 行 'MisMatches' 附近的语法不正确。消息 156,级别 15,状态 1,第 49 行关键字“数据库”附近的语法不正确。

标签: sql-server sql-server-2008


【解决方案1】:

这是执行此操作的一种方法(现在符合您更新的规范)。为此,我有两个单独的 CTE,因为它应该更清楚我在做什么,但是可以使用其他查询来完成同样的事情。

WITH TXInfo AS (  -- Get all info from TX DB with ID matches
    SELECT Product_ID,
        Description, 
        Warranty, 
        Category
    FROM  TXSV..E_MODEL
    WHERE Product_ID IN (
        SELECT  Product_ID
        FROM  OKSV..E_MODEL
        INTERSECT
        SELECT  Product_ID
        FROM  TXSV..E_MODEL
        )
),
MisMatches as (  -- Get all info from OK DB with data mismatches
    SELECT  
         om.Product_ID,
         om.Description,
         om.Warranty,
         om.Category
    FROM  OKSV..E_MODEL om
    INNER JOIN TxInfo ti
        ON om.Product_ID = ti.Product_ID
    WHERE om.Description <> ti.Description
        OR om.Warranty <> ti.Warranty
        OR om.Category <> ti.Category
    )

SELECT 'OK' as [Database], -- Select all OK data
    mm.Product_Id,
    mm.Description,
    mm.Warranty,
    mm.Category
FROM Mismatches mm
UNION
SELECT 'TX',  -- Select only TX data that didn't match
    ti.Product_Id,
    ti.Description,
    ti.Warranty,
    ti.Category
FROM TXInfo ti
INNER JOIN Mismatches mm
    ON ti.Product_Id = mm.Product_Id
ORDER BY Product_Id, 
    1 desc -- Will not let us order by the name of the field here.

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 2017-06-24
    • 2012-04-27
    • 2022-12-21
    • 1970-01-01
    • 2013-05-18
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多