从连接表中获取多个不同的值

时间:2012-11-01 23:08:19

标签: sql postgresql

如果没有多个子查询,我无法找到一种查询的好方法。我不能重组表格,所以这不是一个选择。这是设置:

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个子查询,但必须有一个更简洁的方法。另外,如果你想提一个更好的数据库结构,我对它的开放态度是为了将来的数据库生产。

3 个答案:

答案 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';

    在MySQL中解决此问题

    某些RDBMS接受SQL服务器的其他替代分隔符,例如[]

  • 单引号 '根据ANSI标准划分。一些RDBMS(如MySQL或SQL Server)在列名称周围容忍它们作为通用字符串分隔符。尽管如此,他们都不会接受表名。

  • 反引号 ´作为标识符的分隔符只是MySQL的奇怪之处。同样,您可以使用SET sql_mode = 'ANSI';

  • 在MySQL中解决此问题

这是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;