Нужно найти разницу между таблицами
У меня есть структура таблицы следующим образом:
Мне нужно найти разницу между таблицами как данные, которых нет в другой таблице (наоборот). Я могу найти разницу следующим образом:
Sql Query используется:
select *
from (select input_name_id, count(1) as cnt
from Table1
group by input_name_id
) a join
(select input_name_id, count(1) as cnt
from Table2
group by input_name_id
) b
on (a.input_name_id = b.input_name_id)
where a.cnt <> b.cnt
Ожидаемый результат:
Я попробовал несколько способов получить данные, но не смог! Так что ваша помощь очень ценится. Спасибо
2 ответа
Решение
Две вещи: (1) полное внешнее соединение; (2) перечислить строки с одинаковыми значениями:
select *
from (select input_name_id, match_id, name,
row_number() over (partition by input_name_id, match_id, name order by name) as seqnum
from Table1
) a full join
(select input_name_id, match_id, name,
row_number() over (partition by input_name_id, match_id, name order by name) as seqnum
from Table2
) b
on a.input_name_id = b.input_name_id and
a.match_id = b.match_id and
a.name = b.name and
a.seqnum = b.seqnum
where a.seqnum is null or b.seqnum is null;
Простое решение с использованием кроме и объединение всех
select null as a_input_name_id, null as a_matchid, null as a_name, input_name_id as b_input_name_id, matchid as b_matchid, name as b_name
from
(select input_name_id, matchid, name, row_number() over (partition by input_name_id, matchid, name order by input_name_id) as rw_num
from t2
except
select input_name_id, matchid, name, row_number() over (partition by input_name_id, matchid, name order by input_name_id) as rw_num
from t1 ) a
union all
select input_name_id as a_input_name_id, matchid as a_matchid, name as a_name, null as b_input_name_id, null as b_matchid, null as b_name
from
(select input_name_id, matchid, name, row_number() over (partition by input_name_id, matchid, name order by input_name_id) as rw_num
from t1
except
select input_name_id, matchid, name, row_number() over (partition by input_name_id, matchid, name order by input_name_id) as rw_num
from t2) b