Элегантный способ создания отчетов о синхронизации таблиц в Oracle?

Итак, у меня есть две таблицы

ТАБЛИЦА_А

KEYA | VALUE
1    |  1.2
2    |  2.3
3    |  8.3

ТАБЛИЦА_B

KEYB | VALUE
1    |  1.2
3    |  1.6
4    |  5.5

И я хочу создать отчет о состоянии синхронизации между этими двумя таблицами. т.е. Создайте для каждой записи следующую информацию:

  1. Запись X находится в TABLE_A, но не в TABLE_B
  2. Запись X находится в TABLE_B, но не в TABLE_A
  3. Запись X присутствует в обеих таблицах, но отличается значением VALUE.
  4. (синхронизированные записи не будут отображаться в отчете)

Текст мне особо не нужен (на самом деле я его не хочу). Это могут быть только сами значения:

[Table_A.KEYA (if present)]|[Table_A.Value (if present)]|[Table_B.KEYB (if present)]|[Table_B.Value (if present)]

Приведенные примеры таблиц должны давать:

|2|2.3| |   |
|3|8.3|3|1.6|
| |   |4|5.5|

В настоящее время я делаю это с помощью длинных серий соединений и минусов, но решил, что это должно быть довольно обычным явлением для БД, и у Oracle, возможно, есть более элегантный (и, возможно, более эффективный) способ сделать это. Может ли кто-нибудь снять несколько советов?

Милль спасибо!

f.


person filippo    schedule 12.11.2010    source источник


Ответы (1)


Я думаю, что присоединения и минусы в порядке :-)

Приведенный выше пример даст что-то вроде

select *, null, null
from a
where not exists (select keyb
  from b 
  where keyb = a.keya)
union all
select a.*, b.*
from a, b
where a.keya = b.keya
and a.value <> b.value -- please extend if null values are allowed
union all
select null, null, *
from b
where not exists (select keya
  from a
  where keya = b.keyb)

Вскоре он становится беспорядочным с большим количеством столбцов.

person Martin Schapendonk    schedule 12.11.2010