1

次のような 3 つのテーブルがあります。

表 1 の構造:
名前: registered_applicant_details
フィールド: Application_id INT PRIMARY_KEY、state_id INT;

表 2 構造:
名前: oc_shortlisted_candidates
フィールド: 候補 ID; >>> 外部キーは、registered_applicant_details の application_id を参照します

表 3 構造:
名前: oc_selected_candidates
フィールド: 候補_id; >>> 外部キーは、registered_applicant_details の application_id を参照します

次のような結果セットが必要です: state_wise_counts

state_id | shortlisted_count | selected_counts

結果を得るための私のアプローチは

ステップ 1: このような 2 つのビューを作成しました

CREATE VIEW  state_wise_shortlisted_count AS 
    (select rad.state_id AS state_id,
             count(0) AS shortlisted 
      from (oc_shortlisted_candidates oec 
             join registered_applicant_details rad) 
      where (oec.candidate_id = rad.applicant_id) 
      group by rad.state_id);

CREATE VIEW state_wise_selected_count AS 
      (select rad.state_id AS state_id,
               count(0) AS selected 
      from (oc_selected_candidates oec 
            join registered_applicant_details rad)
      where (oec.candidate_id = rad.applicant_id) 
      group by rad.state_id);

ステップ 2: これら 2 つのビューを state_id で再度結合しました

SELECT s.state_id, sho.shortlisted, sel.selected
FROM statewise_shortlisted_count sho
JOIN statewise_selected_count sel ON sel.state_id = sho.state_id;

私のアプローチの欠点

2 つの外部テーブル (shortlisted_candidates と selected_candidates) があるので、2 つのビューを作成していますが、10 個のテーブルが意味するようにすると、10 個のビューを作成する必要があります。
したがって、「state_wise counts」の場合、10 個のビューを作成する必要があります。もう 1 つの属性、つまり「city」が存在する場合、また「city_wise_counts」が必要な場合は、さらに 10 個のビューを作成する必要があります。
これは正しい方法ではないと思います。

正しい解決策を教えてください。
注:これらのテーブルには約10,000のレコードがあり、アプリケーションからのdb呼び出しの数を減らす必要があるため、サブクエリを使用したくありません

4

1 に答える 1

1

サブクエリのパフォーマンスについて何を意味するのかわかりません。現在のコードは、射影のカウントごとに RAD テーブルから 1 回読み取ります。サブクエリがさらに悪化する可能性はありますか?

次のようなことを試してください:

select rad.state_id AS state_id
         ,  sum (case when oslc.candidate_id is not null then 1 else 0 end) AS shortlisted
         ,  sum (case when osec.candidate_id is not null then 1 else 0 end) AS selected
from registered_applicant_details rad
     left outer join oc_shortlisted_candidates oslc 
          on (rad.applicant_id = oslc.candidate_id) 
     left outer join oc_selected_candidates osec  
          on (rad.applicant_id = osec.candidate_id) 
group by rad.state_id;

警告: テストされていないコードです!

于 2012-06-11T15:48:07.383 に答える