Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL:NOT IN с sub select не работи според очакванията?

Ще направя предположението, че има поне един запис в sales_flat_order който отговаря на условието status != 'holded' и чий customer_email е NULL .

(NOT) IN е изключително труден с NULL s, ето един пример.

Разгледайте следната заявка:

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

Това дава запис със стойност 1 , както се очаква.

Ако обаче промените това на:

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

След това заявката създава празен набор от резултати. Това е добре известен проблем с (NOT) IN . Поради тази причина обикновено трябва да избягвате този синтаксис и да използвате (NOT) EXISTS вместо. Горната заявка може да бъде пренаписана като:

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
)

Демо на DB Fiddle

За вашето запитване:

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. Табло за обяви - Оптимизация на база данни

  2. Navicat за MySQL

  3. Отделете различна версия на уебсайт

  4. MySQL поддържа ли потребителски дефинирани типове данни

  5. Създайте външен ключ с jpa