Mysql
 sql >> Base de données >  >> RDS >> Mysql

WHERE la valeur N'EST PAS DANS (sous-requête)

Mise à jour : Nous devrions préférer utiliser des jointures pour de meilleures performances lorsque c'est facile à faire pour nous. Joindre ou sous-requête

Violon SQL

Select distinct Customer from orders o
join 
(
  SELECT distinct Customer as changedname FROM Orders o2 
  join
  (
     Select distinct invoice from Promotions where Coupon='couponA'
  ) t3
  on o2.invoice = t3.invoice      
) t2
on o.customer != t2.changedname;

Remarque :J'ai changé le nom de la colonne client pour t3 car deux tables jointes doivent avoir des noms de colonne différents

Explication :

L'utilisation de requêtes internes ou de sous-requêtes coûte cher lorsque vous avez du Big Data. utilisez plutôt des jointures, apprenons à convertir une sous-requête en jointure

Avec Sous-requête Nous avons :

Select distinct Customer from orders where customer not in 
(SELECT distinct Customer FROM Orders where invoice in
(Select distinct invoice from Promotions where Coupon='couponA'));

Convertir une sous-requête en jointure

Première étape :

Select distinct Customer from orders o
join 
(
  SELECT distinct Customer as changedname FROM Orders where invoice in
  (Select distinct invoice from Promotions where Coupon='couponA')
) t2
on o.customer != t2.changedname;

2ème étape :

Select distinct Customer from orders o
join 
(
  SELECT distinct Customer as changedname FROM Orders o2 where invoice 
  join
  (
     Select distinct invoice from Promotions where Coupon='couponA'
  ) t3
  on o2.invoice = t3.invoice      
) t2
on o.customer != t2.changedname;

Et c'est tout, beaucoup plus rapide pour les tableaux ayant de nombreuses lignes

Réponse originale :

Utiliser not in . Jetez un œil.

Select distinct Customer from orders where customer not in 
(SELECT distinct Customer FROM Orders where invoice in
(Select distinct invoice from Promotions where Coupon='couponA'));

Modifier J'ai ajouté distinct pour rendre la requête plus rapide

Violon SQL