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