PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Temukan catatan di mana bergabung tidak ada

Gunakan EXISTS ekspresi:

WHERE NOT EXISTS (
   SELECT FROM votes v  -- SELECT list can be empty
   WHERE  v.some_id = base_table.some_id
   AND    v.user_id = ?
   )

Perbedaannya

... antara NOT EXISTS() (Ⓔ) dan NOT IN() (Ⓘ) ada dua:

  1. Kinerja

    umumnya lebih cepat. Itu berhenti memproses subquery segera setelah kecocokan pertama ditemukan. Panduan:

    Subquery umumnya hanya akan dieksekusi cukup lama untuk menentukan apakah setidaknya satu baris dikembalikan, tidak sampai selesai.

    juga dapat dioptimalkan oleh perencana kueri, tetapi pada tingkat yang lebih rendah karena NULL penanganan membuatnya lebih kompleks.

  2. Kebenaran

    Jika salah satu nilai yang dihasilkan dalam ekspresi subquery adalah NULL , hasil dari adalah NULL , sedangkan logika umum mengharapkan TRUE - dan akan mengembalikan TRUE . Panduan:

    Jika semua hasil per baris tidak sama atau nol, dengan setidaknya satu nol, maka hasil NOT IN adalah nol.

Intinya, (NOT) EXISTS adalah pilihan yang lebih baik dalam banyak kasus.

Contoh

Kueri Anda dapat terlihat seperti ini:

SELECT *
FROM   questions q
WHERE  NOT EXISTS (
    SELECT FROM votes v 
    WHERE  v.question_id = q.id
    AND    v.user_id = ?
    );

Jangan jangan bergabung ke votes dalam kueri dasar. Itu akan membatalkan usaha.

Selain NOT EXISTS dan NOT IN ada opsi sintaks tambahan dengan LEFT JOIN / IS NULL dan EXCEPT . Lihat:

  • Pilih baris yang tidak ada di tabel lain


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Evolusi Fault Tolerance di PostgreSQL:Synchronous Commit

  2. haruskah saya mengaktifkan kumpulan pernyataan c3p0?

  3. Bagaimana cara menjatuhkan database PostgreSQL jika ada koneksi aktif ke sana?

  4. GALAT:kolom relasi tidak ada PostgreSQL, Tidak dapat menjalankan kueri penyisipan

  5. BUAT TABEL PostgreSQL