1

ここでは CASE を使用する必要があると感じていますが、よくわかりません。一般的なテーブルから性別 (m/f) を取得しようとしています。性別に応じて、対応するテーブルからビルドを取得します。たとえば、性別が m の場合、クエリは males テーブルに移動して male_build を選択することでそれを認識している必要があります。私が達成しようとしていることのアイデアを与えるために、サンプルクエリと一緒に出力をまとめました。

members table
member_id | member_name
------------------------
     1         Herb
     2         Karen
     3         Megan
     4         Pablo

males table
male_id | member_id | male_build
---------------------------------
    1         1        muscular
    2         4          fat

females table
female_id | member_id | female_build
-------------------------------------
    1           2           thin
    2           3           fat 

general table
general_id | member_id | sex
-----------------------------
     1          1         m
     2          2         f
     3          3         f
     4          4         m

出力は次のようになります。

1. Herb is a muscular male.
2. Karen is a thin female.
3. Megan is a fat female.
4. Pablo is a fat male.
   -> query = "SELECT g.general_id, g.member_id, g.sex,   
              (CASE when g.sex=m THEN SELECT ma.male_build AS build 
                   FROM males ma WHERE ma.member_id=g.member_id,
              CASE when g.sex=f THEN SELECT fe.female_build AS build 
                   FROM females fe WHERE fe.member_id=g.member_id),
               m.member_name 
               FROM members m
               JOIN members m ON g.member_id=m.member_id 
               WHERE g.sex='m' OR g.sex='f'";

このタスクの効率的なクエリを探しています。

4

3 に答える 3

1

このようなクエリを実行する必要がある場合は、データベースの設計スキーマを再考することをお勧めします。そうは言っても、これはうまくいくはずです:

SELECT mem.*, g.*, coalesce(m.male_build, f.female_build) as build
from members_table mem
inner join general g on mem.meber_id = g.member_id
left join males m on mem.member_id = m.member_id
left join females f on mem.member_id = f.member_id
于 2012-04-27T16:01:16.143 に答える
0

私はbuild_typesあなたのテーブルにテーブルと外部キーを持っているだけmembersです。特殊なケースかもしれませんが、筋肉質の女性と痩せた男性を獲得できます。

于 2012-04-27T16:33:08.403 に答える
0
Select M.member_name + ' is a ' 
    + gender_attributes.sex_name 
    + ' ' 
    + gender_attributes.build
From members As M
    Join general_table As G
        On G.member_id = M. member_id   
    Join    (
            Select 'm' As sex, 'male' As sex_name, male_id as id, member_id, male_build As build
            From males_table    
            Union All 
            Select 'f' As sex, 'female', female_id, member_id, female_build
            From females_table
            ) As gender_attributes
        On gender_attributes.sex = G.sex
            And gender_attributes.member_id = M.member_id
于 2012-04-27T16:29:24.123 に答える