Определите разницу в столбце в определенной строке для определенного ключевого столбца - PullRequest
1 голос
/ 16 мая 2019

У меня есть две таблицы в SQL Server, table1 и table2. Оба имеют одинаковую схему и одинаковое количество строк. Я пытаюсь выяснить, есть ли какая-либо разница в значении столбца для определенных строк.

Я сделал с Except, чтобы найти разницу, но есть миллионы строк, поэтому пытаюсь настроить.

Код:

select * from T1
except
select * from T2

Но приведенный выше код не возвращает правильный результат.

CREATE TABLE T1
(
    KEYCOL VARCHAR(60),
    COL2 CHAR(20),
    COL3 INT,
    COL4 VARCHAR(30)
)

INSERT INTO T1
    SELECT 1000004177   R09 1   909622  UNION ALL
    SELECT 1000004478   Q22 1   3659573 UNION ALL
    SELECT 1000008983   Q16 1   955987  UNION ALL
    SELECT 1000010178   XX1 1   3069968 UNION ALL
    SELECT 1000013347   R09 1   3679779 UNION ALL
    SELECT 1000014510   Q16 1   YYY23   UNION ALL
    SELECT 1000015230   R17 1   1000015230 UNION ALL    
    SELECT 1000016049   Q16 1   1000016049 UNION ALL    
    SELECT 1000016332   Q16 1   1000016332

CREATE TABLE T2
(
    KEYCOL VARCHAR(60),
    COL2 CHAR(20),
    COL3 INT,
    COL4 VARCHAR(30)
)

INSERT INTO T2
    SELECT 1000004177   R09 1   909622  UNION ALL
    SELECT 1000004478   Q22 1   3659573 UNION ALL
    SELECT 1000008983   Q16 1   955987  UNION ALL
    SELECT 1000010178   ZZZ 1   3069968 UNION ALL
    SELECT 1000013347   R09 1   3679779 UNION ALL
    SELECT 1000014510   Q16 1   ZZZ23   UNION ALL
    SELECT 1000015230   R17 1   1000015230 UNION ALL    
    SELECT 1000016049   Q16 1   1000016049 UNION ALL    
    SELECT 1000016332   Q16 1   1000016332

Желаемый вывод:

1000004177  NO CHANGE
1000004478  NO CHANGE
1000008983  NO CHANGE
1000010178  CHANGE IN COL2
1000013347  NO CHANGE
1000014510  CHANGE IN COL4
1000015230  NO CHANGE
1000016049  NO CHANGE
1000016332  NO CHANGE

Пожалуйста, поделитесь своими мыслями.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Вы можете использовать join и некоторую условную логику.Примерно так:

select t1.keycol,
       stuff( (case when t1.col2 <> t2.col2 then ', CHANGE IN COL2' else '' end) +
              (case when t1.col3 <> t2.col3 then ', CHANGE IN COL3' else '' end) +
              (case when t1.col4 <> t2.col4 then ', CHANGE IN COL4' else '' end)
              1, 2, '')
from t1 join
     t2
     on t1.keycol = t2.keycol;

Эта версия выдает '', когда столбцы все одинаковые, а не 'NO CHANGE'.

0 голосов
/ 16 мая 2019

Вы можете создать таблицу с первичным ключом и хешем всех столбцов в таблице.Вот несколько примеров: SQL-способ получения MD5 или SHA1 всей строки
Вставка ключей и хэшей из обеих исходных таблиц в хэш-таблицу.

После создания такой таблицы выможно запустить:

SELECT PrimaryKey,Hash
FROM HashTable 
GROUP BY PrimaryKey,Hash
HAVING COUNT(1) = 1

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...