#sql #oracle #union #full-outer-join
#sql #Oracle #объединение #полное внешнее соединение
Вопрос:
Table1:
Acct Cust Owner Name
1111 A111 PRIM Dan Jason
1111 B111 SECO Donna Jason
1111 C111 SECO July Jason
Таблица 2:
Acct Cust Owner Name
2222 B111 PRIM Donna Jason
2222 C111 SECO July Jason
2222 DD22 SECO Jimmy James
Я должен сравнить таблицу1.Настроить поле против таблицы2.Поле Cust. Если все t1.cust и t2.cust одинаковы, то запись можно игнорировать. Если какой-либо из t1.cust(ов) отличается от t2.cust (ов), запись должна быть сообщена.
В приведенном выше примере, поскольку один клиент в таблице 1 и таблице 2 разные (Дэн Джейсон и Джимми Джеймс), а все остальные похожи, мне нужно сообщить оба номера счетов 1111 и 2222, указав, что клиенты разные.
Это похоже на ВПР в Excel. Однако я не уверен, возможно ли это в Oracle. Может кто-нибудь подсказать мне?
Ответ №1:
Возможно, это не самый эффективный способ, но он интуитивно понятен. Вы можете найти все записи Table1, которые не существуют в Table2 , используя MINUS
, а затем UNION
этот результирующий набор со всеми записями Table2, которые не существуют в Table1:
(select Acct, Cust, Owner, Name
from table1
MINUS
select Acct, Cust, Owner, Name
from table2)
UNION
(select Acct, Cust, Owner, Name
from table2
MINUS
select Acct, Cust, Owner, Name
from table1)
Ответ №2:
Вы можете full join
и фильтровать строки, которые не совпадают:
select
coalesce(t1.acct, t2.acct) as acct,
coalesce(t1.cust, t2.cust) as cust,
coalesce(t1.owner, t2.owner) as acct,
coalesce(t1.name, t2.name) as name,
case when t1.acct is null then 't2' else 't1' end as which
from table1 t1
full join t2
on t1.acct = t2.acct
and t1.cust = t2.cust
and t1.owner = t2.owner
and t1.name = t2.name
where t1.acct is null or t2.acct is null
Я добавил в результирующий набор столбец called which
, который указывает, из какой таблицы взята запись.