To je případ relational-division .
Skutečné definice tabulek (standardní vztah 1:n, skrytý Ruby ORM) budou asi takto:
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)
);
Váš pokus o dotaz se efektivně snaží otestovat každý jednotlivý řádek v fees
proti více hodnotám v daném poli, což vždy selže, zatímco prvky pole nejsou identické. Jedna hodnota nemůže být stejná jako násobek jiné hodnoty. Potřebujete jiný přístup:
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[]);
To za předpokladu odlišných hodnoty ve vašem poli a jedinečné položky ve vaší tabulce poplatky jako vynucené UNIQUE
omezení, které jsem přidal výše. Jinak počty nejsou spolehlivé a musíte použít sofistikovanější dotaz. Zde je arzenál možností:
Jak vidíte, nezapojil jsem tabulku instructor_student
vůbec. Zatímco referenční integrita je vynucována omezením FK (jako obvykle), můžeme pracovat s fees
k určení způsobilého instructor_student_id
. Pokud potřebujete načíst další atributy z hlavní tabulky, udělejte to ve 2. kroku, například:
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;