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 скажет, какая строка вызывает несоответствие
Со следующими допущениями:
- Вы сравниваете только столбцы sal для источника и цели
- Источник и цель объединяются на основе первичного ключа 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)))