SQL для получения только несоответствия столбцов

Я хотел знать, можем ли мы получить только несовпадающий набор данных из таблицы при проведении объемного тестирования, пожалуйста, посмотрите на приведенный ниже пример:

Если приведенная ниже таблица является моей целевой таблицей, которую я тестирую, если данные загружены правильно, я бы написал SQL, чтобы выбрать столбцы из источника и сделать минус для целевой таблицы, если, скажем, источник имеет sal для XXX как 2000, то это несоответствие от источника к цели, возможно ли получить только столбец id и sal в качестве результата запроса минус.

Чтобы было ясно, если у меня есть таблица со 100 столбцами, чтобы выполнить тест "минус", все 100 столбцов будут возвращены, даже если в 1 столбце есть несоответствие, поэтому я хочу, чтобы был возвращен только 1 столбец, который имеет несоответствие.

id  Name sal
--  ---- ----
1   XXX 1000
2   YYY 2000
3   ZZZ 4000
4   AAA 5000

3 ответа

С предположениями ниже

И исходная, и целевая таблицы имеют общий первичный ключ

Тогда оператор case может быть использован для сужения точного столбца, который вызывает несоответствие

http://sqlfiddle.com/#!2/a78eca/16

select 
ST.id,
case 
when ST.name!=TT.name then 'Issue in name' 
When ST.sal!=TT.sal then 'Issue in Sal'
Else 'OK' END As Check_Column
From source_table ST, Target_table TT
where ST.id=TT.id
and (ST.name!=TT.name OR ST.sal!=TT.sal)

Вышеприведенное объяснение состоит в том, что условие where будет отфильтровывать только ошибочные строки, а оператор case скажет, какая строка вызывает несоответствие

Со следующими допущениями:

  1. Вы сравниваете только столбцы sal для источника и цели
  2. Источник и цель объединяются на основе первичного ключа id

Запрос может быть записан как:

SELECT
        T1.Name, T1.sal, S1.sal
FROM
        schemaName.TargetTable T1, 
        schemaName.SourceTable S1
WHERE 
        T1.id = S1.id
        AND T1.sal <> S1.sal

Допустим, ваш целевой набор данных находится в "TargetTable", а ваш исходный набор данных - в "SourceTable"; Возможно, вы могли бы попробовать что-то вроде:

SELECT Name, Sal FROM TargetTable as t
WHERE (NOT EXISTS 
    (SELECT Name, Sal from SourceTable as s
     WHERE(Name = t.Name) OR (Sal = t.Sal)))
Другие вопросы по тегам