小编典典

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

sql

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

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个子查询,但是必须有一种更清洁的方法。另外,如果您想提一个更好的数据库结构,我也很乐意为将来的数据库生产做准备。


阅读 225

收藏
2021-04-07

共1个答案

小编典典

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 Server。

  • 单引号 '限定 根据ANSI标准。一些RDBMS(例如MySQL或SQL Server)允许它们在列名周围作为通用字符串定界符。两者都不接受表名周围的内容。

  • *作为标识符分隔符的 *反引号 仅是MySQL的奇数。同样,您可以使用以下方法在MySQL中修复此问题:SET sql_mode = 'ANSI';

这是数据库及其标识符的分隔符列表

2021-04-07