Dat is een geval van relational-division .
Werkelijke tabeldefinities (standaard 1:n-relatie, verborgen door de Ruby ORM) zullen ongeveer als volgt zijn:
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)
);
Uw poging tot een zoekopdracht probeert effectief elke afzonderlijke rij te testen tegen fees
tegen meerdere waarden in de gegeven array, die altijd mislukt terwijl elementen van de array niet identiek zijn. Eén waarde kan niet hetzelfde zijn als multiple andere waarden. Je hebt een andere aanpak nodig:
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[]);
Dit veronderstelt verschillend waarden in uw array en unieke vermeldingen in uw tafelkosten, zoals afgedwongen door de UNIQUE
beperking die ik hierboven heb toegevoegd. Anders zijn tellingen niet betrouwbaar en moet u een meer geavanceerde query gebruiken. Hier is een arsenaal aan opties:
Zoals je kunt zien, heb ik de tabel instructor_student
niet gebruikt helemaal niet. Hoewel referentiële integriteit wordt afgedwongen met een FK-beperking (zoals gewoonlijk het geval is), kunnen we werken met fees
alleen om de kwalificerende instructor_student_id
te bepalen . Als je meer attributen uit de hoofdtabel moet halen, doe dat dan in een 2e stap, zoals:
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;