web-dev-qa-db-fra.com

Qu'est-ce qu'un équivalent de sauf (dans PostgreSQL) dans MySQL?

Je souhaite trouver des enregistrements inégalés de deux tables dans MySQL.

3
user142670

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)
6
Lennart