1

1対多の関係にある2つのテーブルがあるとしましょう。親行のすべての列と子行の合計を表示するビュー/クエリを作成したいと思います。これは私がかなり頻繁に遭遇しているシナリオであり、この問題に対するはるかに優れた明白な解決策を見逃しているように感じずにはいられません。私が使用したものの1つは、次のような子テーブルに対する複数の結合です。

SELECT vt.*, COALESCE(count(mvAyes.*), 0) as Ayes, COALESCE(count(mvNoes.*), 0) as Noes  FROM VoteTable vt 
LEFT JOIN MemberVote mvAyes on mvAyes.VoteId = vt.Id AND mvAyes.Vote = 'Aye'
LEFT JOIN MemberVote mvNoes on mvNoes.VoteId = vt.Id AND mvNoes.Vote = 'No'
GROUP BY vt.Col1, vt.Col2 ... (all columns in Vote table)

もう1つの解決策は、相関サブクエリを使用することです。これは、上記の複数結合ソリューションもかなり非効率的であると思いますが、私が理解しているように、かなり非効率的です。

それで、私が気付いていないより良い解決策はありますか?ありがとう!

4

1 に答える 1

2

はい、より簡単な解決策があります。

SELECT vt.*,
       sum(case when mv.Vote = 'Aye' then 1 else 0 end) as Ayes,
       sum(case when mv.Vote = 'No' then 1 else 0 end) as Nos
FROM VoteTable vt left outer join
     MemberVote mv
     on mv.VoteId = vt.Id 
GROUP BY vt.Col1, vt.Col2 ... (all columns in Vote table)

サブクエリで group by を実行すると、これをさらに単純化できます。

select vt.*, mv.ayes, mv.noes
from vt left outer join
     (select VoteId, sum(case when mv.Vote = 'Aye' then 1 else 0 end) as Ayes,
             sum(case when mv.Vote = 'No' then 1 else 0 end) as Nos
      from MemberVote mv
      group by VoteId
     ) mv
     on vt.id = mv.VoteId
于 2012-08-31T17:00:19.593 に答える