Itu adalah kasus relational-division .
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
;