mysql - MYSQL 中的右外连接问题

标签 mysql sql join

无论我使用左外连接还是右外连接,外连接似乎都不起作用:

SELECT * FROM `event_orchestra_musicians` eom
right outer join `orchestra_instruments` oi on eom.instrument_id = oi.oi_id
where event_id = 2
order by instrument_id

Orchestra_instruments 包含具有唯一 ID 的不同乐器,即:

  1. fiddle
  2. 中提琴
  3. 竖琴
  4. 短笛

Event_Orchestra_Musicians 是一个将音乐家与乐器连接起来的查找表,即:

musician_id, instrument_id, event_id, 
1 1 2
2 1 2
3 3 2
4 2 2

当我使用这些表中的数据进行任何外部联接时,我会得到内部联接的结果(Piccolo 不会显示空的音乐家 ID,它根本不会显示)。我是不是做错了什么?

编辑:

所以我做了一些胡闹。问题似乎是因为 events_orchestra_musicians 表中有一条记录,其 event_id 为 5,instrument_id 为 7。如果我删除该记录,则外连接有效。我不明白的是,如果该记录在那里,并且我使用 where 子句来查找 event_id = 2,那么如果其中有一条 Instrument_id 为 7 的记录(如果其 event_id 为 5),那么为什么它很重要?

最佳答案

试试这个:

select oi.oi_id, oi.instrument_name, eom.musician_id
from orchestra_instruments oi
left join event_orchestra_musicians eom on oi.oi_id = eom.instrument_id
where (eom.event_id = 2 or eom.event_id is null)
order by oi.oi_id

您必须使用 Orchestra_instruments 作为基表,因为这是您想要所有记录的表,即使不存在音乐家也是如此。我无法想象使用右连接而不是左连接的任何原因,并且隐含了外部连接。另外,您必须允许 event_id 为 2 或 null,因为如果没有匹配的记录要加入,则它不能为 2。

关于mysql - MYSQL 中的右外连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9131862/

相关文章:

mysql - 如何使用相关子查询进行更新?

mysql - 数据库条目的优先选择

mysql - 我使用 CASE 语句的查询有什么问题

mysql - 只返回连接表中行的有序子集

java - 使用 Java 检测 IRC 中成功的 channel 加入

mysql - 使用 sql studio 在不同表中提取和插入标题行

java - 如何创建一个饼图来显示每个人注册的东西的数量?

Mysql JSON_MERGE_PATCH 正在完全替换第一个 json

sql - 如何向 SQL Server 2008 中的列添加自动增量

mysql - 动态连接 MySQL 表