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

ALL operator dalam klausa WHERE di Rails

Itu adalah kasus .

Definisi tabel yang sebenarnya (hubungan standar 1:n, disembunyikan oleh Ruby ORM) akan menjadi seperti ini:

CREATE TABLE instructor_student (
   id serial PRIMARY KEY
   name ...
);

CREATE TABLE fees (
   id serial PRIMARY KEY
 , instructor_student_id integer NOT NULL REFERENCES instructor_student
 , course_type ...
 , monthly_detail date
 , UNIQUE (instructor_student_id, course_type, monthly_detail)
);

Upaya Anda pada kueri secara efektif mencoba menguji setiap baris dalam fees terhadap beberapa nilai dalam larik yang diberikan, yang selalu gagal sementara elemen array tidak identik. Satu nilainya tidak boleh sama dengan banyak nilai-nilai lainnya. Anda memerlukan pendekatan yang berbeda:

SELECT instructor_student_id
FROM   fees
WHERE  course_type = ?
AND    monthly_detail = ANY(ARRAY[?]::date[])  -- ANY, not ALL!
GROUP  BY instructor_student_id
HAVING count(*) = cardinality(ARRAY[?]::date[]);

Ini dengan asumsi berbeda nilai dalam larik Anda dan entri unik dalam tabel Anda dikenakan biaya seperti yang diberlakukan oleh UNIQUE batasan yang saya tambahkan di atas. Jika tidak, penghitungan tidak dapat diandalkan dan Anda harus menggunakan kueri yang lebih canggih. Berikut adalah gudang opsi:

Seperti yang Anda lihat, saya tidak melibatkan tabel instructor_student sama sekali. Sementara integritas referensial diberlakukan dengan batasan FK (seperti biasanya), kita dapat bekerja dengan fees sendiri untuk menentukan instructor_student_id yang memenuhi syarat . Jika Anda perlu mengambil lebih banyak atribut dari tabel utama, lakukan pada langkah ke-2, seperti:

SELECT i.*  -- or whatever you need
FROM   instructor_student i
JOIN  (
   SELECT ...  -- query from above
   ) f ON f.instructor_student_id = i.id
;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bekerja dengan tanggal di PostgreSQL

  2. Tanggal dan waktu di UTC - bagaimana cara menyimpannya di postgres?

  3. Lupa Password Admin di Postgres (Instalasi Windows), tidak bisa reset

  4. Bagaimana Anda membuat PyPy, Django dan PostgreSQL bekerja bersama?

  5. Pilih nomor baris di postgres