Det är ett fall av relational-division .
Faktiska tabelldefinitioner (standard 1:n-relation, dolda av Ruby ORM) kommer att vara ungefär så här:
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)
);
Ditt försök till en fråga försöker effektivt testa varje enskild rad i fees
mot flera värden i den givna arrayen, som alltid misslyckas medan element i arrayen inte är identiska. En värde kan inte vara detsamma som flera andra värden. Du behöver ett annat tillvägagångssätt:
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[]);
Detta förutsätter distinkt värden i din array och unika poster i dina bordsavgifter som tillämpas av UNIQUE
begränsning jag lagt till ovan. Annars är räkningar inte tillförlitliga och du måste använda en mer sofistikerad fråga. Här är en arsenal av alternativ:
Som du kan se involverade jag inte tabellen instructor_student
alls. Även om referensintegritet upprätthålls med en FK-begränsning (som det vanligtvis är), kan vi arbeta med fees
ensam för att fastställa kvalificerande instructor_student_id
. Om du behöver hämta fler attribut från huvudtabellen, gör det i ett andra steg, som:
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;