Question

J'ai un problème similaire à cette question StackOverflow, sauf que je nécessité d'exclure certains champs de la comparaison, mais toujours inclure dans le jeu de résultats.
Je penning le problème comme différence symétrique localement.

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 pour inclure X.

Était-ce utile?

La solution

Ancien SQL pour une jointure complète - A concaténée avec B, à l'exclusion des lignes en B aussi 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

Les années de Coalesce sont là pour la sécurité; Je ne l'ai jamais eu en fait la cause 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 qui retourne un résultat non nul, alors il y a une différence. Il ne vous dit pas quelle table il est, mais il est un début.

Autres conseils

sons comme celui-ci est fondamentalement ce que vous voulez. Faites correspondre les lignes entre les 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top