sql >> Base de Datos >  >> RDS >> PostgreSQL

TODO operador en la cláusula WHERE en Rails

Ese es un caso de .

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
;