我必须使用以下关系创建一个选择查询:
我需要找到每个队长的名字,如果没有队长,我需要展示“没有队长”。现场队长p与member_id的数据相同。不幸的是,member_id是主键,所以我不相信我可以加入它们。如果有队长,则布尔grad_p为0,如果没有队长则为1。如果团队表中没有团队队长,则team_captain元组会有数据“null”'。
我一直在研究这个问题并且谷歌搜索没有帮助我找到解决方案。
答案 0 :(得分:2)
您可以使用外部联接。外连接将返回一个表的所有行,无论它是否在另一个表中有任何相应的匹配。换句话说,如果我在team_captain
和member_id
列上加入“团队”和“人员”,即使成员为空,我也会得到所有团队。例如,假设人员看起来像这样:
| member_id | name |
+-----------+------+
| 1 | John |
| 2 | Jane |
| 3 | Jack |
团队看起来像这样:
| team_id | team_captain |
+---------+--------------+
| 1 | 1 |
| 2 | null |
| 3 | 3 |
我可以预先形成外部联接以获得团队队长的名字:
SELECT t.team_id, p.name
FROM teams t
LEFT JOIN personnel p ON p.member_id = t.team_captain;
我将得到名称,如果不存在则为空字段:
| team_id | name |
+---------+------+
| 1 | John |
| 2 | null |
| 3 | Jack |
以下是有关outer joins的更多信息。现在,MySQL提供的一个奇特的功能是COALESCE。这是一个返回第一个非null参数的函数。您可以使用它将这些空字段替换为“No Captain”:
SELECT t.team_id, COALESCE(p.name, 'No Captain') AS captain
FROM teams t
LEFT JOIN personnel p ON p.member_id = t.team_captain;
以下是我的表格的SQL Fiddle示例。