Това е случай на relational-division .
Действителните дефиниции на таблици (стандартна връзка 1:n, скрити от Ruby ORM) ще бъдат нещо подобно:
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)
);
Вашият опит за заявка ефективно се опитва да тества всеки отделен ред в fees
срещу множество стойности в дадения масив, което винаги не успее, докато елементите на масива не са идентични. Едно стойността не може да бъде същата като множество други стойности. Имате нужда от различен подход:
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[]);
Това предполага различно стойности във вашия масив и уникални записи във вашата таблица такси като наложени от UNIQUE
ограничение, което добавих по-горе. В противен случай преброяването не е надеждно и трябва да използвате по-сложна заявка. Ето арсенал от опции:
Както можете да видите, не използвах таблицата instructor_student
изобщо. Докато референтната цялост се налага с FK ограничение (както обикновено), можем да работим с fees
сам за определяне на квалифициран instructor_student_id
. Ако трябва да извлечете повече атрибути от главната таблица, направете това във втора стъпка, като:
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;