Нужна логика Oracle SQL для сравнения данных между двумя таблицами :: как ВПР в Excel

#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 , который указывает, из какой таблицы взята запись.