Ese es un caso de relational-division .
Las definiciones de tablas reales (relación estándar 1:n, ocultas por el ORM de Ruby) serán algo como esto:
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)
);
Su intento de consulta intenta probar cada fila en fees
contra múltiples valores en la matriz dada, que siempre falla mientras los elementos de la matriz no son idénticos. Uno el valor no puede ser el mismo que múltiple otros valores. Necesita un enfoque 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[]);
Esto supone distinto valores en su matriz y entradas únicas en las tarifas de su tabla como las impuestas por UNIQUE
restricción que agregué arriba. De lo contrario, los conteos no son confiables y debe usar una consulta más sofisticada. Aquí hay un arsenal de opciones:
Como puede ver, no involucré la tabla instructor_student
en absoluto. Si bien la integridad referencial se aplica con una restricción FK (como suele ser), podemos trabajar con fees
solo para determinar la calificación instructor_student_id
. Si necesita obtener más atributos de la tabla principal, hágalo en un segundo paso, como:
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;