Aktualizacja: Powinniśmy używać preferuj, aby używać złączeń, aby uzyskać lepszą wydajność, gdy jest to dla nas łatwe. Dołącz a podzapytanie
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;
Uwaga:zmieniłem nazwę kolumny customer na t3, ponieważ dwie połączone tabele muszą mieć różne nazwy kolumn
Wyjaśnienie:
Używanie zapytania wewnętrznego lub podrzędnego jest kosztowne, gdy masz duże zbiory danych. zamiast tego użyj złączeń, nauczmy się konwertować podzapytanie, aby dołączyć
Z Podzapytaniem Mieliśmy:
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'));
Konwertowanie podzapytania na dołączenie
Pierwszy 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;
Drugi 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;
I to wszystko, znacznie szybciej w przypadku tabel z wieloma wierszami
Oryginalna odpowiedź:
Użyj not in
. Zajrzyj.
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'));
Edytuj Dodałem wyróżnienie, aby przyspieszyć zapytanie