如果没有多个子查询,我无法找到一种查询的好方法。我不能重组表格,所以这不是一个选择。这是设置:
person:
person_id
person_want_id,
person_need_id,
person_ability_id,
person_willingness_id
person_status_types:
status_type_id
status_type_name
每个人的身份都属于person_status_types。我需要提取的是每个id的status_type_name。
所以return语句看起来像这样:
person_id | person_want_name | person_need_name | person_ability_name | person_willingness_name
现在我只做了4个子查询,但必须有一个更简洁的方法。另外,如果你想提一个更好的数据库结构,我对它的开放态度是为了将来的数据库生产。
答案 0 :(得分:4)
SELECT p.person_id
,want.status_type_name AS person_want_name
,need.status_type_name AS person_need_name
,abt.status_type_name AS person_ability_name
,wil.status_type_name AS person_willingness_name
FROM person p
LEFT JOIN person_status_types want ON p.person_want_id = want.status_type_id
LEFT JOIN person_status_types need ON p.person_need_id = need.status_type_id
LEFT JOIN person_status_types abt ON p.person_ability_id = abt.status_type_id
LEFT JOIN person_status_types wil ON p.person_willingness_id = wil.status_type_id
使用LEFT JOIN
以避免丢失行
而你不能单引号标识符(如另一个答案所示)。单引号用于值。
由于这引发了一些争论,一劳永逸地澄清:
双引号 "
根据任何ANSI标准划分标识符。这是所有RDBMS支持的普遍,MySQL是唯一的例外。您可以使用SET sql_mode = 'ANSI';
某些RDBMS接受SQL服务器的其他替代分隔符,例如[]
。
单引号 '
根据ANSI标准划分值。一些RDBMS(如MySQL或SQL Server)在列名称周围容忍它们作为通用字符串分隔符。尽管如此,他们都不会接受表名。
反引号 ´
作为标识符的分隔符只是MySQL的奇怪之处。同样,您可以使用SET sql_mode = 'ANSI';
这是list of databases and their respective delimiters for identifiers。
答案 1 :(得分:1)
你不需要做子查询,你可以只做JOIN:
SELECT p.person_id,
want.status_type_name AS "person_want_name",
need.status_type_name AS "person_need_name",
ability.status_type_name AS "person_ability_name",
willingness.status_type_name AS "person_willingness_name"
FROM person p
JOIN person_status_types want ON p.person_want_id = want.status_type_id
JOIN person_status_types need ON p.person_need_id = need.status_type_id
JOIN person_status_types ability ON p.person_ability_id = ability.status_type_id
JOIN person_status_types willingness ON p.person_willingness_id = willingness.status_type_id
请注意,表别名可帮助您区分您引用的表格的哪个“副本”,并且每个表都与person
的不同列相关联。
编辑:评论已经确定PostgreSQL不允许列引号的单引号,它与ANSI匹配。让我感到惊讶,因为MySQL和SQL Server支持它。我的查询现已修复。
答案 2 :(得分:0)
尝试这样的事情:
SELECT person_id, st1.status_type_name AS want, st2.status_type_name AS need, st3.status_type_name AS ability, st4.status_type_name AS willingness
FROM person p
LEFT OUTER JOIN person_status_types st1 ON p.person_want_id=st1.status_type_id
LEFT OUTER JOIN person_status_types st2 ON p.person_need_id=st2.status_type_id
LEFT OUTER JOIN person_status_types st3 ON p.person_ability_id=st3.status_type_id
LEFT OUTER JOIN person_status_types st4 ON p.person_willingness_id=st4.status_type_id;