sql >> Databasteknik >  >> RDS >> Mysql

MySQL:NOT IN med sub select fungerar inte som förväntat?

Jag kommer att anta att det finns minst en post i sales_flat_order som uppfyller villkoret status != 'holded' och vars customer_email är NULL .

(NOT) IN är notoriskt knepigt med NULL s, här är ett exempel.

Tänk på följande fråga:

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

Detta ger en post med värdet 1 , som förväntat.

Men om du ändrar det till:

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

Sedan producerar frågan en tom resultatuppsättning. Detta är ett välkänt problem med (NOT) IN . Av denna anledning bör du i allmänhet undvika denna syntax och använda (NOT) EXISTS istället. Ovanstående fråga kan skrivas om 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

För din fråga:

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. Hur kan jag anropa en SQL-funktion i C#?

  2. Uppdatering av rader baserat på andra rader i samma tabell

  3. Schemalagt underhåll av IS-databasen dygnet runt i MS SQL Server

  4. Hur man lägger till främmande nyckel (MySQL)