Aktualizováno: Měli bychom raději používat spojení pro lepší výkon, když je to pro nás snadné. Připojit se vs. dílčí dotaz
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;
Poznámka:Změnil jsem název sloupce customer pro t3, protože dvě spojené tabulky musí mít různé názvy sloupců
Vysvětlení:
Použití vnitřního nebo dílčího dotazu je drahé, když máte velká data. místo toho použijte spojení, naučte se převádět poddotaz na spojení
Pomocí Poddotazu Měli jsme:
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'));
Převod dílčího dotazu na připojení
První krok:
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. krok:
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;
A je to, mnohem rychlejší pro tabulky s mnoha řádky
Původní odpověď:
Použijte not in
. Podívejte se.
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'));
Upravit Přidal jsem odlišné, aby byl dotaz rychlejší