Mysql
 sql >> Database >  >> RDS >> Mysql

WHERE il valore NON È IN (sottoquery)

Aggiornato: Dovremmo usare preferire usare i join per prestazioni migliori quando è facile da fare per noi. Partecipa e sottoquery

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

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

SQL Fiddle