Актуализирано: Трябва да използваме предпочитание да използваме обединения за по-добра производителност, когато това е лесно за нас. Присъединяване спрямо подзаявка
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;
Забележка:Промених името на колона клиент за t3, защото две свързани таблици трябва да имат различни имена на колони
Обяснение:
Използването на вътрешна или подзаявка е скъпо, когато имате големи данни. вместо това използвайте съединения, нека се научим да преобразуваме подзаявка в присъединяване
С Подзаявка Имахме:
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'));
Преобразуване на подзаявка в присъединяване
Първа стъпка:
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-ра стъпка:
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;
И това е всичко, много по-бързо за таблици с много редове
Оригинален отговор:
Използвайте not in
. Разгледайте.
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'));
Редактиране Добавих различен, за да направя заявката по-бърза