2010-08-25 7 views
0

J'ai un problème similaire à this StackOverflow question, sauf que j'ai besoin d'exclure certains champs de la comparaison mais de l'inclure dans le jeu de résultats.
Je pose le problème en tant que différence localement symétrique.Différence localement symétrique en sql

Par exemple, le tableau A et B ont des colonnes X, Y, Z et je veux comparer uniquement Y, Z des différences, mais je veux encore le jeu de résultats à inclure X.

+1

Exemple de données et de sortie prévue s'il vous plaît –

Répondre

0

Ancien SQL pour une jointure complète - A concaténé avec B, ce qui exclut les lignes de B également en A (au milieu):

-- all rows in A with or without matching B 
select a.x, a.y, a.z 
    from a 
     left join b 
     on a.x = b.x 
     and a.y = b.y 
union all 
-- all rows in B with no match in A to "exclude the middle" 
select b.x, b.y, null as z 
    from b 
where not exists (select null 
        from a 
        where b.x = a.x 
         and b.y = a.y) 

ANSI style:

select coalesce(a.x, b.x) as x, 
     coalesce(a.y, b.y) as y, 
     a.z 
    from a 
     full outer join b 
     on a.x = b.x 
     and a.y = b.y 

sont là pour la sécurité au coalesce; Je n'ai jamais vraiment eu de raison d'écrire une jointure externe complète dans le monde réel.

Si ce que vous voulez vraiment savoir si deux tables sont identiques, voici comment:

SELECT COUNT(*) 
    FROM (SELECT list_of_columns 
      FROM one_of_the_tables 
     MINUS 
     SELECT list_of_columns 
      FROM the_other_table 
     UNION ALL 
     SELECT list_of_columns 
      FROM the_other_table 
     MINUS 
     SELECT list_of_columns 
      FROM one_of_the_tables) 

Si cela retourne un résultat non nul, alors il y a une différence. Cela ne vous dit pas dans quelle table il se trouve, mais c'est un début.

+1

Cette dernière requête sera également de retour 0 si 'one_of_the_tables' contient un sous-ensemble de données dans' the_other_table'. Vous devez faire le MINUS dans les deux directions pour tester si les ensembles de données sont complètement identiques. –

+0

@Dave Costa - Vous avez raison, monsieur. Réponse corrigée. –

2

Cela ressemble en gros à ce que vous voulez. lignes de correspondance entre deux tables sur des colonnes Y et Z, trouver les lignes inégalées, et la sortie des valeurs des colonnes X, Y et Z.

SELECT a.x, a.y, a.z, b.x, b.y, b.z 
    FROM a FULL OUTER JOIN b ON a.y = b.y AND a.z = b.z 
    WHERE a.y IS NULL OR b.y IS NULL 
Questions connexes