sql >> Database >  >> RDS >> Mysql

MySQL:NOT IN met subselectie werkt niet zoals verwacht?

Ik ga ervan uit dat er ten minste één record is in sales_flat_order die voldoet aan de voorwaarde status != 'holded' en wiens customer_email is NULL .

(NOT) IN is notoir lastig met NULL s, hier is een voorbeeld.

Beschouw de volgende vraag:

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

Dit levert een record op met waarde 1 , zoals verwacht.

Als u dat echter verandert in:

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

Vervolgens produceert de query een lege resultatenset. Dit is een bekend probleem met (NOT) IN . Om deze reden moet u deze syntaxis over het algemeen vermijden en (NOT) EXISTS gebruiken in plaats van. De bovenstaande vraag kan worden herschreven als:

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 op DB Fiddle

Voor uw vraag:

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. Is COUNT(rowid) sneller dan COUNT(*)?

  2. Krijg volledige MySQL-queryreeks bij invoegen of bijwerken

  3. Verschil tussen twee ongeordende afgebakende lijsten (Oracle)

  4. Meest efficiënte manier om duizenden rijen te selecteren uit een lijst met ID's