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
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