如何去除SQL查询中的嵌套子查询 简化语句获得目标结果集
等价无嵌套查询实现
你可以直接将CASE判断放到MAX聚合函数内,同时可将原FULL OUTER JOIN简化为LEFT JOIN(原查询WHERE条件已限定f.fruit_number非空,不需要全外连接),最终无嵌套查询写法如下:
SELECT f.fruit_number, MAX(CASE WHEN e.expiration_date IS NULL AND e.fruit_number IS NOT NULL THEN 1 ELSE 0 END) AS expirationDate FROM fruits f LEFT JOIN expiration e ON f.fruit_number = e.fruit_number GROUP BY f.fruit_number ORDER BY f.fruit_number
上述查询返回的结果和你原有嵌套写法的结果完全一致,逻辑等价,且更简洁易读。
临时表方案疑问解答
该方案和原有嵌套查询逻辑是完全等价的,本质是把原查询中优化器自动完成的「子查询计算+外层聚合」两步操作,显式拆分为「子查询结果写入临时表→读取临时表做聚合」两个执行步骤。
但该方案并不适合你当前的场景:你的查询逻辑简单、数据量小,使用临时表反而会额外增加临时表的读写开销,性能不如上面给出的简化版无嵌套查询,仅在子查询结果集极大、需要多次复用该结果集的场景下,临时表方案才具备性价比。
内容的提问来源于stack exchange,提问作者njminchin
相关产品推荐
相关产品推荐

