首页/数据/SQL 速查/一对多连接的行数放大

一对多连接的行数放大

连接“多”侧后结果按多行展开:订单连明细后每个订单出现多行,做统计前先确定口径。

SQL 速查数据更新于 2026-10-12

行数放大演示

行数放大演示
SELECT COUNT(*)               AS joined_rows,
       COUNT(DISTINCT o.id)   AS real_orders
FROM orders o
JOIN order_items i ON i.order_id = o.id;

先聚合再连接

先聚合再连接
SELECT o.id, o.amount, t.item_count
FROM orders o
JOIN (
    SELECT order_id, COUNT(*) AS item_count
    FROM order_items
    GROUP BY order_id
) t ON t.order_id = o.id;
计数修正COUNT(DISTINCT 主键) 或先聚合再连接
金额类主表金额会被明细行重复累加,SUM 前确认粒度
手段子查询、CTE、窗口函数都可以控制粒度

易错点

  • 统计订单数却得到明细行数是线上报表常见错误,核对 COUNT(*) 与 COUNT(DISTINCT o.id) 的差异
  • 对主表字段求和时若连接了明细,数字会被重复放大,先看粒度再定聚合层

数据来源与参考

  • MySQL 8.0 Reference Manual · GROUP BY · MySQL Handling
  • PostgreSQL Documentation · Aggregate Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌