Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:NOT IN z subselect nie działa zgodnie z oczekiwaniami?

Przyjmę założenie, że istnieje co najmniej jeden rekord w sales_flat_order spełnia warunek status != 'holded' i którego customer_email jest NULL .

(NOT) IN jest notorycznie trudne z NULL s, oto przykład.

Rozważ następujące zapytanie:

SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)

Daje to rekord o wartości 1 zgodnie z oczekiwaniami.

Jeśli jednak zmienisz to na:

SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)

Następnie zapytanie generuje pusty zestaw wyników. Jest to dobrze znany problem z (NOT) IN . Z tego powodu powinieneś generalnie unikać tej składni i używać (NOT) EXISTS zamiast. Powyższe zapytanie można przepisać jako:

SELECT 1 a
FROM (SELECT 1 a) t1
WHERE NOT EXISTS (
    SELECT 1
    FROM (SELECT 2 a UNION ALL SELECT NULL) t2
    WHERE t1.a = t2.a
)

Demo na DB Fiddle

Twoje zapytanie:

SELECT customer_email 
FROM sales_flat_order s
WHERE NOT EXISTS (
    SELECT 1
    FROM sales_flat_order s1
    WHERE s1.customer_email = s.customer_email AND s.status != 'holded'
);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. gdzie w klauzuli mysql

  2. Wyświetlaj dzień lub datę jako kolumnę w mysql

  3. Niestandardowe zadanie rake dla DB:Nie znaleziono tabeli

  4. PHP PDO - Pokazywanie hasła przy zbyt wielu połączeniach

  5. Problemy z kodowaniem tekstu MySQL C#