如何将普通SELECT语句改写为包含嵌套查询的SELECT语句
普通SELECT改嵌套查询指导
原查询逻辑拆解
原语句通过三表关联查询2001年12月、场地为House of Blues的演出相关信息,核心逻辑分为三层:
- 从venue表筛选出名称为
House of Blues对应的FacilityNo - 从showrequest表匹配上述
FacilityNo,拿到对应的活动编号eventno、演出类型genre - 从showschedule表匹配上述
eventno,同时筛选演出日期在2001年12月的记录,返回需要的字段
嵌套查询分层对应规则
嵌套查询遵循从内到外逐层过滤的逻辑,每层对应原语句的一部分过滤/关联逻辑:
- 内层查询:负责过滤维度表的限定条件,输出结果作为外层的筛选依据
- 外层查询:负责主表的过滤和最终字段返回,关联内层结果完成筛选
改写后的嵌套查询示例
两层嵌套写法(最常用)
SELECT planno, s1.eventno, showdate, genre FROM showschedule s1 JOIN showrequest s2 ON s1.eventno = s2.eventno WHERE showdate BETWEEN '2001-12-01' AND '2001-12-31' AND s2.FacilityNo IN ( -- 内层查询:单独筛选符合要求的场地编号 SELECT FacilityNo FROM venue WHERE venuename = 'House of Blues' )
对应关系:
- 内层查询:对应原语句中venue表的过滤逻辑
- 外层查询:对应原语句中showrequest、showschedule的关联和日期过滤逻辑
三层嵌套写法(分层更清晰)
SELECT planno, eventno, showdate, genre FROM showschedule WHERE showdate BETWEEN '2001-12-01' AND '2001-12-31' AND eventno IN ( -- 中间层查询:筛选符合场地要求的活动编号 SELECT eventno FROM showrequest WHERE FacilityNo IN ( -- 最内层查询:筛选符合要求的场地编号 SELECT FacilityNo FROM venue WHERE venuename = 'House of Blues' ) )
对应关系:
- 最内层查询:对应原语句venue表的过滤逻辑
- 中间层查询:对应原语句showrequest表和venue表的关联逻辑
- 最外层查询:对应原语句showschedule表的关联、日期过滤和字段返回逻辑
两种写法的执行结果和原语句完全一致,可根据实际场景选择使用。
内容的提问来源于stack exchange,提问作者eepers
相关产品推荐
相关产品推荐

