家族、親、子供、クラブの 4 つのテーブルがあります。家族には多くの親と多くの子供がいます。子供たちは多くのクラブ会員を持っています。
親と子のそれぞれ、名前、メールアドレス、および子供が所属するすべてのクラブのすべての ID のすべての配列を返す、名前とメールアドレスをすばやく検索するための「ビュー」を作成したいと思います。
ビューに表示したいクエリについて、これまでに持っているものは次のとおりです。
SELECT
families.id AS family_id,
'Child' AS searchable_type,
concat(children.first_name, ' ',children.last_name) AS term,
'' AS email,
array_agg(memberships.club_id) AS clubs
FROM children
INNER JOIN families ON children.family_id = families.id
LEFT JOIN memberships ON children.id = memberships.child_id
GROUP BY families.id, term, email
UNION
SELECT
families.id AS family_id,
'Parent' AS searchable_type,
concat(parents.first_name, ' ',parents.last_name) AS term,
parents.email AS email,
array_agg(memberships.club_id) AS clubs
FROM parents
INNER JOIN families ON parents.family_id = families.id
INNER JOIN children ON families.id = children.family_id
LEFT JOIN memberships ON children.id = memberships.child_id
GROUP BY families.id, email, term
質問は次のとおりです。
- 子供と親の重複する club_id を取り除くにはどうすればよいですか?
それは本当に遅いクエリです。インデックスが作成されている場合、子または親で書き込みが発生するたびにビューが更新されますか?
実行計画は次のとおりです。 http://explain.depesz.com/s/BA9
- ここにsqlfiddleがあります:http://sqlfiddle.com/#!15/9c737/2