Две базы данных с одинаковыми таблицами и именами столбцов. Как извлечь один столбец с аналогичными данными, в то время как все остальные столбцы показывают различия? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть 2 базы данных с именами 'OK' и 'TX' с той же таблицей с именем 'E_Model ' и такими столбцами, как: 'Product_ID', 'Description', 'Warranty' и 'Category' Я хочу получить список идентификаторов продуктов, которые есть в обеих таблицах, и хочу узнать разницу во всех других столбцах одновременно.

Желаемый результат должен быть таким:

**'*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

Это просто показало мне другой список. В основном, я пытаюсь узнать различия в описании, категории и гарантии одинаковых идентификаторов продукта в обеих таблицах. Я делаю это, чтобы я мог очистить данные. Я новичок в этом, пожалуйста, помогите, так как я сейчас делаю это один за другим, что займет много времени.

1 Ответ

0 голосов
/ 05 сентября 2018

Вот один из способов сделать это (теперь соответствует вашим обновленным спецификациям). У меня есть два отдельных 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...