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

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的不同乐器,即:


小提琴
中提琴
竖琴
短笛


Event_Orchestra_Musicians是一个查找表,用于将音乐家加入乐器,即:

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


当我使用这些表中的数据进行任何外部联接时,我将获得内部联接的结果(Piccolo不会显示为null的musicer_id,也不会显示出来)。我做错什么了吗?

编辑:

所以我四处游荡。问题似乎是因为events_orchestra_musicians表中有一条记录,其中event_id为5,instrument_id为7。如果删除该记录,则外部联接有效。我没有得到的是该记录是否存在,而我使用where子句查找event_id = 2,为什么如果event_id为5,那么其中是否有一条Instrument_id为7的记录又有什么关系呢?

最佳答案

尝试这个:

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。

10-07 20:40