You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从子查询中选取多列?寻求SQL专家建议

优化子查询获取多列的SQL方案

嗨,我完全懂你的困扰——多个独立子查询确实会因为反复扫描bookings表拖慢查询速度,尤其是数据量上来之后,性能问题会更突出。其实我们可以通过JOIN结合预先聚合的方式,一次性拿到所有需要的汇总数据,只扫描一次bookings表,性能会提升不少。

优化后的SQL示例

SELECT 
    c.id AS 'Customer ID',
    c.name AS 'Customer Name',
    COALESCE(b.total_commission, 0) AS 'Customer Commission',
    COALESCE(b.total_order, 0) AS 'Total Order Amount'
FROM 
    customers AS c
LEFT JOIN (
    SELECT 
        customer_id,
        SUM(commission) AS total_commission,
        SUM(order_total) AS total_order
    FROM bookings
    GROUP BY customer_id
) AS b ON b.customer_id = c.id
WHERE 
    c.status = 'active';

为什么这个方案更高效?

  • 减少表扫描次数:原来的多个相关子查询会对bookings表执行N次扫描(N是符合条件的客户数),而这个方案只扫描一次bookings表,先按客户分组聚合出所有汇总值,再和customers表关联。
  • 优化执行计划:数据库优化器对关联查询的处理通常比多个子查询更高效,如果bookings.customer_id上有索引,分组和关联的速度会进一步提升。
  • 兼容无订单的客户:用LEFT JOIN可以保留所有活跃客户,哪怕他们没有任何订单;COALESCE函数把空值替换成0,避免结果出现NULL,让数据更规整。

额外优化建议

确保bookings.customer_id字段上创建了索引,这样分组和关联的效率会更高;如果customers.status的筛选条件会过滤掉大量数据,也可以给customers.status添加索引进一步提速。

内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:33:04