sql >> Databasteknik >  >> RDS >> Mysql

WHERE value IS NOT IN (underfråga)

Uppdaterad: Vi bör använda att föredra att använda joins för bättre prestanda när det är lätt att göra för oss. Gå med vs. underfråga

Sql Fiddle

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;

Obs:Jag ändrade kolumnnamnskund för t3 eftersom två sammanfogade tabeller måste ha olika kolumnnamn

Förklaring:

Det är dyrt att använda inre eller sub-query när du har big data. använd joins istället, låt oss lära oss att konvertera subquery till join

Med Subquery Vi hade:

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

Konverterar underfråga för att gå med

Första steget:

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;

Steg 2:

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;

Och det är det, mycket snabbare för tabeller med många rader

Ursprungligt svar:

Använd not in . Ta en titt.

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

Redigera Jag har lagt till distinkt för att göra frågan snabbare

SQL Fiddle



  1. Fälttyper och användningar i Access 2019-databaser

  2. Hur man visar sekvensnummer i MySQL-frågeresultat

  3. Viloläge användning av PostgreSQL-sekvensen påverkar inte sekvenstabellen

  4. Dynamisk SQL-resultat till temporär tabell i SQL Stored-procedur