如何将含RIGHT JOIN的SQL查询改写为仅用LEFT JOIN(SQLAlchemy场景)
用LEFT JOIN改写原RIGHT JOIN查询
原查询的两次RIGHT JOIN加上WHERE ot.event_id = 1的过滤条件,语义上等价于以ot_note_procedure为主表的LEFT JOIN写法,具体改写如下:
SELECT * FROM dbo.ot_note_procedure op LEFT JOIN dbo.ot_note_item oi ON op.ot_note_id = oi.ot_note_id LEFT JOIN dbo.ot_note ot ON op.ot_note_id = ot.id WHERE ot.event_id = 1
改写逻辑说明
- 原查询的两次RIGHT JOIN最终是以
ot_note_procedure作为结果集的基础(最后一次RIGHT JOIN会保留该表的所有行),但WHERE ot.event_id = 1会过滤掉所有未匹配到有效ot记录的行,因此可以直接将ot_note_procedure作为主表。 - 利用
ot_note_id直接关联ot_note_item和ot_note_procedure(两者的ot_note_id指向同一个ot记录),替代原查询中通过ot表中转的关联方式。 - 最后通过LEFT JOIN关联
ot表,并保留ot.event_id = 1的过滤条件,确保和原查询语义完全一致。
内容的提问来源于stack exchange,提问作者lacidexh
相关产品推荐
相关产品推荐

