Questo è un caso di relational-division .
Le effettive definizioni della tabella (relazione 1:n standard, nascosta dall'ORM di Ruby) saranno qualcosa del genere:
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)
);
Il tuo tentativo di eseguire una query tenta efficacemente di testare ogni singola riga in fees
rispetto a più valori nella matrice data, che sempre fallisce mentre gli elementi dell'array non sono identici. Uno il valore non può essere uguale a multiplo altri valori. Hai bisogno di un approccio diverso:
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[]);
Questo presuppone distinto valori nella tua matrice e voci univoche nella tua tabella tariffe come imposto da UNIQUE
vincolo che ho aggiunto sopra. Altrimenti, i conteggi non sono affidabili e devi usare una query più sofisticata. Ecco un arsenale di opzioni:
Come puoi vedere, non ho coinvolto la tabella instructor_student
affatto. Sebbene l'integrità referenziale sia applicata con un vincolo FK (come in genere), possiamo lavorare con fees
da solo per determinare instructor_student_id
qualificante . Se hai bisogno di recuperare più attributi dalla tabella principale, fallo in un secondo passaggio, come:
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;