2010-11-12 6 views
1

J'ai donc mes deux tablesUne manière élégante de faire des rapports de synchronisation de table dans Oracle?

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 

Et je veux créer un rapport de l'état de synchronisation entre ces deux tables. C'est à dire. Générer pour chaque enregistrer les informations suivantes:

  1. enregistrement X est en TABLE_A mais pas dans TABLE_B
  2. enregistrement X est en TABLE_B mais pas dans TABLE_A
  3. enregistrement X est présente dans les deux tableaux, mais diffère VALEUR
  4. (les enregistrements synchronisés ne figurera pas dans le rapport)

Je ne ai pas vraiment besoin du texte (en fait, je ne veux pas). Peut-être juste les valeurs même:

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

Les exemples de tableaux donnés céderais:

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

Je suis en train de faire cela avec languit série de jointures et points négatifs tout autour, mais pensé que devrait être tout à fait commun pour les DB et Oracle peut-être avoir un moyen plus élégant (et peut-être plus efficace) de le faire. Quelqu'un pourrait-il tirer quelques conseils?

Merci à vous!

f.

Répondre

1
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 
+0

c'est ce que je voulais dire :) – filippo

1

Je pense que des jointures et des points négatifs sont très bien :-)

L'exemple ci-dessus donnerait quelque chose comme

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) 

Il obtient bientôt en désordre avec beaucoup de colonnes.

Questions connexes