sql >> Databáze >  >> RDS >> Mysql

MySQL:NOT IN s dílčím výběrem nefunguje podle očekávání?

Budu předpokládat, že v sales_flat_order existuje alespoň jeden záznam který splňuje podmínku status != 'holded' a jehož customer_email je NULL .

(NOT) IN je notoricky složité s NULL s, zde je příklad.

Zvažte následující dotaz:

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

Výsledkem je záznam s hodnotou 1 podle očekávání.

Pokud to však změníte na:

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

Potom dotaz vytvoří prázdnou sadu výsledků. Toto je dobře známý problém s (NOT) IN . Z tohoto důvodu byste se měli obecně vyhnout této syntaxi a použít (NOT) EXISTS namísto. Výše uvedený dotaz by mohl být přepsán 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
)

Ukázka na DB Fiddle

Pro váš dotaz:

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. Parametr časového limitu IDLE v Oracle

  2. SQL:jak byl v tomto případě vytvořen dotaz v pořadí SQL

  3. Používání rolí Nové v MySQL 8

  4. Importujte čínský znak do tabulky mysql