Элегантный способ делать отчеты о синхронизации таблиц в Oracle? - PullRequest
1 голос
/ 12 ноября 2010

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

TABLE_A

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

TABLE_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 присутствует в обеих таблицах, но отличается по значению
  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, возможно, есть более элегантный (и, возможно, более эффективный) способ сделать это. Может ли кто-нибудь стрелять несколько советов?

Спасибо, мил!

е.

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

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

В приведенном выше примере получится что-то вроде

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)

Вскоре он запутается со множеством столбцов.

1 голос
/ 12 ноября 2010
select a.keya, a.value a_value, b.keyb, b.value b_value
from table_a a
full outer join table_b b
on a.keya = b.keyb
where a.keya IS NULL
or b.keya IS NULL
or (a.value is null and b.value is not null)
or (a.value is not null and b.value is null)
or a.value <> b.value
...