Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL:TIDAK DI dengan sub pilih tidak berfungsi seperti yang diharapkan?

Saya akan membuat asumsi bahwa setidaknya ada satu record di sales_flat_order yang memenuhi kondisi status != 'holded' dan yang customer_email adalah NULL .

(NOT) IN terkenal rumit dengan NULL s, ini contohnya.

Pertimbangkan pertanyaan berikut:

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

Ini menghasilkan catatan dengan nilai 1 , seperti yang diharapkan.

Namun jika Anda mengubahnya menjadi:

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

Kemudian kueri menghasilkan kumpulan hasil kosong. Ini adalah masalah yang terkenal dengan (NOT) IN . Untuk alasan ini, Anda biasanya harus menghindari sintaks ini, dan menggunakan (NOT) EXISTS alih-alih. Kueri di atas dapat ditulis ulang sebagai:

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

Untuk pertanyaan Anda:

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. Indeks MySQL untuk Grup Berdasarkan / Pesan Berdasarkan

  2. SQL menggabungkan hasil menjadi objek di codeigniter

  3. MYSQL memesan berdasarkan waktu am/pm

  4. Apa perbedaan antara count(0), count(1).. dan count(*) di mySQL/SQL?

  5. teka-teki transaksi MySQL