Je souhaite trouver des enregistrements inégalés de deux tables dans MySQL.
Vous pouvez utiliser un NOT EXISTS
prédicat. Supposons que vous voulez imiter:
select a.c1, a.c2 from a
except
select b.c1, b.c2 from b
Cela peut être exprimé comme:
select distinct a.c1, a.c2
from a
where not exists (
select 1 from b
where b.c1 = a.c1
and b.c2 = a.c2
)
D'autres options sont d'utiliser une jointure gauche et de rechercher NULL:
select distinct a.c1, a.c2
from a
left join b
on a.c1 = b.c1
and a.c2 = b.c2
where b.c1 is null
Notez que ceux-ci diffèrent de EXCEPT
si le même tuple existe dans les deux relations et contient NULL. Soit A = {(1,1), (2,2), (1, null)} et b = {(1,1), (1, null)}
select a.c1, a.c2 from a
except
select b.c1, b.c2 from b
(2,2)
Dans un sens, EXCEPT
considère que NULL soit égal à NULL, alors que le prédicat A.C2 = B.C2 évalue à NULL si A.C2 ou B.C2 est null et en conséquence NOT EXISTS
Évalue à FALSE.
select distinct a.c1, a.c2
from a
where not exists (
select b.c1, b.c2 from b where a.c1 = b.c1 and a.c2 = b.c2
)
(2,2),(1,null)
LEFT JOIN
se comporte de la même manière à NOT EXISTS
:
select distinct a.c1, a.c2
from a
left join b
on a.c1 = b.c1 and a.c2 = b.c2
where b.c1 is null
(2,2),(1,null)