sql >> Base de Datos >  >> RDS >> Mysql

DONDE el valor NO ESTÁ EN (subconsulta)

Actualizado: Deberíamos usar preferir usar uniones para un mejor rendimiento cuando es fácil de hacer para nosotros. Unirse vs. subconsulta

Violín 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:Cambié el nombre de la columna cliente para t3 porque dos tablas unidas deben tener nombres de columna diferentes

Explicación:

El uso de consultas internas o secundarias es costoso cuando tiene grandes datos. use uniones en su lugar, aprendamos a convertir subconsultas en uniones

Con Subconsulta Tuvimos:

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'));

Conversión de subconsulta para unirse

Primer paso:

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;

2do paso:

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;

Y eso es todo, mucho más rápido para tablas que tienen numerosas filas

Respuesta original:

Usar not in . Echa un vistazo.

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'));

Editar He agregado distintivo para que la consulta sea más rápida

Violín SQL