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
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 回答
0

I'd just have a build_types table and a foreign key on your members table. It may be an edge case, but you can get muscular women, and thin guys.

于 2012-04-27T16:33:08.403 回答