#sql #sql-server
#sql #sql-сервер
Вопрос:
Я имею дело с проблемой; Мне нужно объединить две таблицы, сгруппировать по их идентификаторам и использовать инструкцию CASE для сравнения значений из этих 2 таблиц. Я пытался использовать временную таблицу, а затем выбирать из нее.
Цель состоит в том, чтобы проверить, соответствуют ли значения в CORE значениям в MART.
В идеале я хочу иметь один запрос, где я буду видеть столбец CORE_X_MART и могу использовать для него оператор where.
Группировка по важна, потому что в противном случае у меня есть дубликаты идентификаторов во временной таблице.
Мой код:
drop table if exists #tNDWH_4034
select a.ID, b.ID, a.col2 as MART_Value, b.col2 as CORE_Value,
case when a.col2 = b.col2 then 'Match' else 'Mismatch' end as CORE_X_MART
into #tNDWH_4034
from tab1 as a
inner join tab2 as b on a.ID = b.ID
where a.CurrentFlag = 1
group by a.ID, b.ID;
select * from #tNDWH_4034
where CORE_X_MART = 'Mismatch';
Я использую SQL Server.
Комментарии:
1. Пожалуйста, предоставьте образцы данных и желаемые результаты в виде табличного текста.
2.
GROUP BY
предназначен для использования с установленными функциями (MAX(), SUM(), COUNT() и т.д.)3.Это
case
выражение, а не оператор.4. Вы говорите, что это
GROUP BY
сделано намеренно, но вы неGROUP BY
агрегируете все столбцы, которые вы не агрегируете, и вы не агрегируете какие -либоGROUP BY
столбцы, поэтому, конечно, не требуется, и в нынешнем виде это приведет к ошибке.5. Чтобы сделать дублирующиеся значения уникальными, вы можете попробовать использовать
DISTINCT
Ответ №1:
Вам не нужна временная таблица. Вы можете использовать производную таблицу для достижения цели, чтобы иметь их в одном запросе.
SELECT * FROM
(select a.ID, b.ID, a.col2 as MART_Value, b.col2 as CORE_Value,
case when a.col2 = b.col2 then 'Match' else 'Mismatch' end as CORE_X_MART
from tab1 as a
inner join tab2 as b
on a.ID = b.ID
where a.CurrentFlag = 1
group by a.ID, b.ID) as t
WHERE t.CORE_X_MART = 'Mismatch'
Ответ №2:
может быть:
select a.ID, b.ID, a.col2 as MART_Value, b.col2 as CORE_Value,
case when a.col2 = b.col2 then 'Match' else 'Mismatch' end as CORE_X_MART
into #tNDWH_4034
from tab1 as a
inner join tab2 as b on (a.ID = b.ID)
where a.CurrentFlag = 1
group by a.ID, b.ID, a.col2, b.col2
,case when a.col2 = b.col2 then 'Match' else 'Mismatch' end --this line is probably not required
Комментарии:
1. Поскольку основная задача состоит в том, чтобы проверить, есть ли совпадение между значениями в таблицах A и B, я предлагаю ЛЕВОЕ СОЕДИНЕНИЕ, чтобы вы могли также видеть идентификатор в A, а не в B (они будут отображаться как несоответствие, так как
value = NULL
значение false в РЕГИСТРЕ)
Ответ №3:
Вам также не нужны временная таблица, group by или регистр. Вы ищете только несоответствия, поэтому просто используйте оператор not equal to <>
для фильтрации ваших результатов.
select distinct a.ID, a.col2 as MART_Value, b.col2 as CORE_Value
from tab1 as a
inner join tab2 as b on a.ID = b.ID
where a.CurrentFlag = 1
and a.col2 <> b.col2