web-dev-qa-db-fra.com

MySQL: différence de deux jeux de résultats

Comment puis-je obtenir la différence d'ensemble de deux ensembles de résultats?

Disons que j'ai un ensemble de résultats (une seule colonne dans chacun):

result1:
'a'
'b'
'c'

result2:
'b'
'c'

Je veux réduire ce qui est dans result1 par result2: result1 - result2 de telle sorte qu'il soit égal à:

 difference of result1 - result2:
 'a'
39
Zombies

Pour exécuter result1 - result2, vous pouvez joindre result1 à result2, et uniquement les éléments de sortie qui existent dans result1. Par exemple:

SELECT DISTINCT result1.column
FROM result1 LEFT JOIN result2 ON result1.column = result2.column
WHERE result2.column IS NULL

Notez que ce n'est pas une différence d'ensemble , et ne sortira pas les éléments dans result2 qui n'existent pas dans result1. Il est défini soustraction .

Voir aussi: version archivée Web de l'article de blog pertinent .

59
rjh

Si vous voulez des choses dans result1 qui ne sont pas dans result2, qu'en est-il de:

SELECT distinct result1
FROM t1 
WHERE result1 NOT IN (select distinct result2 from t2);

Ou:

SELECT distinct result
from t1 t
where NOT EXISTS (select 1 from t2 where result2 = t.result1)

REMARQUE: si result1 est un sous-ensemble de result2 alors les requêtes ci-dessus renverront un ensemble vide (elles ne vous montreront rien dans result2 qui ne sont pas dans result1) afin qu'ils ne soient pas définis comme des différences, mais peuvent également être utiles (probablement plus efficaces que la jointure externe).

14
Cloom Magoo