Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL:KHÔNG VÀO với lựa chọn phụ không hoạt động như mong đợi?

Tôi sẽ giả định rằng có ít nhất một bản ghi trong sales_flat_order thỏa mãn điều kiện status != 'holded'customer_email của ai là NULL .

(NOT) IN nổi tiếng là phức tạp với NULL s, đây là một ví dụ.

Hãy xem xét truy vấn sau:

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

Điều này tạo ra một bản ghi có giá trị 1 , như mong đợi.

Tuy nhiên, nếu bạn thay đổi điều đó thành:

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

Sau đó, truy vấn tạo ra một tập kết quả trống. Đây là sự cố nổi tiếng với (NOT) IN . Vì lý do này, bạn nên tránh cú pháp này và sử dụng (NOT) EXISTS thay vì. Truy vấn trên có thể được viết lại thành:

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
)

Bản trình diễn trên DB Fiddle

Đối với truy vấn của bạn:

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. php - Làm cách nào để chèn dữ liệu bảng HTML vào MySQL

  2. gửi dữ liệu tới MySQL bằng AJAX + jQuery + PHP

  3. Giám sát các chèn MySQL từ các ứng dụng khác nhau

  4. Excel VBA:ghi vào cơ sở dữ liệu mysql

  5. chọn bản ghi trùng lặp và đếm bản ghi từ dấu phẩy được phân tách trong mysql