Aktualisiert: Wir sollten Joins für eine bessere Leistung verwenden, wenn dies für uns einfach ist. Beitreten vs. Unterabfrage
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;
Hinweis:Ich habe den Spaltennamen Kunde für t3 geändert, weil zwei verknüpfte Tabellen unterschiedliche Spaltennamen haben müssen
Erklärung:
Die Verwendung von inneren oder untergeordneten Abfragen ist teuer, wenn Sie über Big Data verfügen. Verwenden Sie stattdessen Verknüpfungen. Lernen Sie, Unterabfragen in Verknüpfungen umzuwandeln
Mit Unterabfrage Wir hatten:
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'));
Konvertieren der Unterabfrage zum Verbinden
Erster Schritt:
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. Schritt:
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;
Und das war's, viel schneller für Tabellen mit zahlreichen Zeilen
Ursprüngliche Antwort:
Verwenden Sie not in
. Schau mal.
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'));
Bearbeiten Ich habe „distinct“ hinzugefügt, um die Abfrage zu beschleunigen