Mysql
 sql >> Datenbank >  >> RDS >> Mysql

WHERE value IS NOT IN (Unterabfrage)

Aktualisiert: Wir sollten Joins für eine bessere Leistung verwenden, wenn dies für uns einfach ist. Beitreten vs. Unterabfrage

SQL-Geige

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

SQL-Geige