sql >> Database teknologi >  >> RDS >> Mysql

MySQL:NOT IN med sub select virker ikke som forventet?

Jeg vil antage, at der er mindst én post i sales_flat_order der opfylder betingelsen status != 'holded' og hvis customer_email er NULL .

(NOT) IN er notorisk vanskeligt med NULL s, her er et eksempel.

Overvej følgende forespørgsel:

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

Dette giver en post med værdien 1 , som forventet.

Men hvis du ændrer det til:

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

Derefter producerer forespørgslen et tomt resultatsæt. Dette er et velkendt problem med (NOT) IN . Af denne grund bør du generelt undgå denne syntaks og bruge (NOT) EXISTS i stedet. Ovenstående forespørgsel kunne omskrives som:

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 på DB Fiddle

Til din forespørgsel:

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. Spring Boot / JPA / mySQL - mange til en relation skaber for mange SQL-forespørgsler

  2. Oprettelse af en database med MySQL Workbench fra eksisterende skema/model

  3. Konverter en ISO-formateret dato til DATETIME

  4. SQL-forespørgselsfelter som kolonner