C'est un cas de relational-division .
Les définitions de table réelles (relation standard 1:n, masquée par l'ORM Ruby) ressembleront à ceci :
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)
);
Votre tentative de requête essaie effectivement de tester chaque ligne dans fees
contre plusieurs valeurs dans le tableau donné, qui toujours échoue tant que les éléments du tableau ne sont pas identiques. Un la valeur ne peut pas être identique à multiple d'autres valeurs. Vous avez besoin d'une approche différente :
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[]);
Cela suppose distinct valeurs dans votre tableau et entrées uniques dans vos frais de table comme imposé par le UNIQUE
contrainte que j'ai ajoutée plus haut. Sinon, les décomptes ne sont pas fiables et vous devez utiliser une requête plus sophistiquée. Voici un arsenal d'options :
Comme vous pouvez le voir, je n'ai pas impliqué la table instructor_student
du tout. Alors que l'intégrité référentielle est appliquée avec une contrainte FK (comme c'est généralement le cas), nous pouvons travailler avec des fees
seul pour déterminer instructor_student_id
éligible . Si vous avez besoin de récupérer plus d'attributs de la table principale, faites-le dans une 2ème étape, comme :
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;