Esse é um caso de relational-division .
As definições reais da tabela (relação padrão 1:n, oculta pelo Ruby ORM) serão algo assim:
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)
);
Sua tentativa de uma consulta efetivamente tenta testar cada linha em
fees
contra vários valores na matriz fornecida, que sempre falha enquanto os elementos da matriz não são idênticos. Um o valor não pode ser igual a múltiplos outros valores. Você precisa de uma abordagem diferente: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[]);
Isso está assumindo distinto valores em sua matriz e entradas exclusivas em suas taxas de tabela, conforme aplicado pelo
UNIQUE
restrição que adicionei acima. Caso contrário, as contagens não são confiáveis e você precisa usar uma consulta mais sofisticada. Aqui está um arsenal de opções:Como você pode ver, eu não envolvi a tabela
instructor_student
de forma alguma. Embora a integridade referencial seja imposta com uma restrição FK (como normalmente é), podemos trabalhar com fees
sozinho para determinar o instructor_student_id
qualificado . Se você precisar buscar mais atributos da tabela principal, faça isso em uma 2ª etapa, como:SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;