Aggiornato: Dovremmo usare preferire usare i join per prestazioni migliori quando è facile da fare per noi. Partecipa e sottoquery
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;
Nota:ho cambiato il nome della colonna customer per t3 perché due tabelle unite devono avere nomi di colonna diversi
Spiegazione:
L'uso di query interne o secondarie è costoso quando si dispone di big data. usa invece i join, impariamo a convertire le sottoquery in join
Con Subquery Avevamo:
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'));
Conversione della sottoquery per partecipare
Primo passo:
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° passaggio:
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;
E il gioco è fatto, molto più veloce per le tabelle con numerose righe
Risposta originale:
Usa not in
. Dai un'occhiata.
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'));
Modifica Ho aggiunto distinto per rendere la query più veloce