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

ActiveRecord:Bagaimana menemukan orang tua yang SEMUA anaknya cocok dengan suatu kondisi?

Menggunakan arel bisa membuat Anda cukup jauh. Bagian yang sulit adalah bagaimana Anda tidak menulis seluruh kueri Anda menggunakan arel sintaks kueri sendiri?

Berikut triknya:saat membuat kueri menggunakan where , jika Anda menggunakan arel kondisi, Anda mendapatkan beberapa metode tambahan secara gratis. Misalnya, Anda dapat mengekor subquery yang Anda miliki di sana dengan .exists.not , yang akan memberi Anda (NOT ( EXISTS (subquery))) Lemparkan itu ke where orang tua -klausa dan Anda sudah siap.

Pertanyaannya adalah, bagaimana Anda merujuk tabel yang terlibat? Anda membutuhkan Arel untuk itu. Anda bisa gunakan where milik Arel dengan kondisi jeleknya seperti a.eq b . Tapi kenapa? Karena ini adalah kondisi kesetaraan, Anda dapat menggunakan kondisi Rails sebagai gantinya! Anda dapat mereferensikan tabel yang Anda kueri dengan kunci hash, tetapi untuk tabel lain (di kueri luar) Anda dapat menggunakan arel_table . Tonton ini:

parents = Parent.arel_table
Parent.where(
  Child.where(other_parent_id: nil, parent_id: parents[:id]).exists.not
)

Anda bahkan dapat mengurangi penggunaan Arel dengan menggunakan sedikit string dan mengandalkan fakta bahwa Anda dapat memasukkan subkueri sebagai parameter ke where Rails . Tidak banyak gunanya, tetapi itu tidak memaksa Anda untuk menggali terlalu banyak metode Arel, sehingga Anda dapat menggunakan trik itu atau operator SQL lain yang menggunakan subquery (apakah ada yang lain?):

parents = Parent.arel_table
Parent.where('NOT EXISTS (?)',
  Child.where(parent_id: parents[:id], other_parent_id: nil)
)

Dua poin utama di sini adalah:

  • Anda dapat membuat subkueri dengan cara yang sama seperti saat Anda membuat kueri biasa, dengan merujuk tabel kueri luar dengan Arel. Bahkan mungkin bukan tabel nyata, mungkin alias! Hal-hal gila.
  • Anda dapat menggunakan subkueri sebagai parameter untuk where Rails metode baik-baik saja.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL - Periksa kunci asing yang ada saat melakukan SELECT

  2. TypeError:objek 'int' tidak mendukung pengindeksan

  3. PG::Kesalahan dalam klausa GROUP BY

  4. PostgreSQL - INNER GABUNG dua tabel dengan LIMIT

  5. Kelompokkan dan hitung acara per interval waktu, ditambah total lari