2009-10-19 19 views
3

J'ai deux tables ont le même schéma, l'un aura les enregistrements du jour précédent, l'autre aura le courant. Je veux comparer les deux et trouver seulement les changements ou seulement les lignes qui ont une valeur différente d'au moins une colonne.Oracle - différence ou changements entre deux lignes de deux tables

Comment est-ce possible dans pl/sql, oracle? (J'ai codé quelque chose de similaire en utilisant checksum dans T-SQL mais je ne sais pas comment faire en pl/sql)

Répondre

3

Cette réponse SO fournit une solution très efficace en utilisant Oracle pour comparer les résultats de 2 requêtes: Proving SQL query equivalency

3

Vous voulez une requête de différence exclusive, qui est essentiellement une requête (AB) U (BA):

(SELECT * FROM TODAY_TABLE 
MINUS 
SELECT * FROM YESTERDAY_TABLE) 
UNION ALL 
(SELECT * FROM YESTERDAY_TABLE 
MINUS 
SELECT * FROM TODAY_TABLE) 

Cette requête peut également être facilement améliorée pour montrer aussi quels enregistrements sont insertions, suppressions et modifications à l'aide d'une colonne calculée supplémentaire.

+0

cela fonctionne aussi très bien, mais Doughman et vincent a donné une solution plus efficace –

3

Comme Dougman posted l'un des deux ensembles de données de la manière la plus efficace de comparer est de les regrouper. Je l'habitude d'utiliser une requête comme celui-ci pour comparer deux tables:

SELECT MIN(which), COUNT(*), pk, col1, col2, col3, col4 
    FROM (SELECT 'old data' which, pk, col1, col2, col3, col4 
      FROM t 
     UNION ALL 
     SELECT 'new data' which, pk, col1, col2, col3, col4 FROM t_new) 
GROUP BY pk, col1, col2, col3, col4 
HAVING COUNT(*) != 2 
ORDER BY pk, MIN(which); 
+0

c'est aussi une solution très efficace (ne peut pas accepter deux réponses :() –

Questions connexes