Localement différence symétrique dans SQL
-
01-10-2019 - |
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.
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