1

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

person:
person_id
person_want_id,
person_need_id,
person_ability_id,
person_willingness_id

person_status_types:
status_type_id
status_type_name

每个人的 id 都是 person_status_types 类型。我需要提取的是每个 id 的 status_type_name。

所以 return 语句看起来像这样:

person_id | person_want_name | person_need_name | person_ability_name | person_willingness_name

现在我只做 4 个子查询,但必须有一种更清洁的方法。另外,如果您想提及更好的数据库结构,我对未来的数据库生产持开放态度。

4

3 回答 3

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 是唯一的例外。您可以在 MySQL 中使用SET sql_mode = 'ANSI';

    一些 RDBMS 接受额外的替代分隔符,如[]SQL 服务器。

  • 单引号 根据 ANSI 标准'分隔值。一些 RDBMS(如 MySQL 或 SQL Server)允许它们围绕列名作为通用字符串分隔符。不过,它们都不接受它们的表名。

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

这是一个数据库列表及其各自的标识符分隔符

于 2012-11-01T23:16:31.840 回答
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 支持它。我的查询现已修复。

于 2012-11-01T23:12:28.790 回答
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;
于 2012-11-01T23:17:58.477 回答