これは、relational-divisionとタグ付けされた質問を表示 の場合です。 。
実際のテーブル定義(標準の1:n関係、Ruby ORMによって非表示)は次のようになります:
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)
);
クエリを試行すると、fees
の各行を効果的にテストしようとします。 指定された配列内の複数の値に対して、常に 配列の要素が同一でない間は失敗します。 1つ 値を複数と同じにすることはできません 他の値。別のアプローチが必要です:
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[]);
これは、明確を前提としています UNIQUE
によって強制されるような、配列内の値とテーブル内の一意のエントリ 上で追加した制約。それ以外の場合、カウントは信頼できず、より高度なクエリを使用する必要があります。オプションの武器は次のとおりです。
ご覧のとおり、私はテーブルinstructor_student
を関与させませんでした まったく。参照整合性は(通常のように)FK制約で適用されますが、fees
で作業できます。 適格なinstructor_student_id
を決定するために単独で 。メインテーブルからさらに属性をフェッチする必要がある場合は、次のように2番目のステップで取得します。
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;