sql查询 笛卡尔积 子查询
笛卡尔积
定义:
笛卡尔积是数学和数据库理论中的概念,指两个集合中所有可能的有序对组合
在数据库中的表现;
当两个表进行连接时,如果没有合适的连接条件,就会产生笛卡尔积;
结果集的行数等于两个表行数的乘积;
笛卡尔积产生的原因
缺少连接条件
SELECT * FROM table1, table2 (隐式交叉连接)
SELECT * FROM table1 CROSS JOIN table2
连接条件不准确
连接字段不是唯一标识符
多对多关系未经适当过滤
实例问题:
先连接再聚合 容易出现笛卡尔积
应当改为 先聚合 再连接
FROM table_a ta
LEFT JOIN (SELECT column_a, SUM(column_b) AS sum_b, SUM(column_c) AS sum_cFROM table_bGROUP BY column_a
) summary ON ta.column_a = summary.column_a 1. 子查询聚合操作
- 子查询 `summary` 对 `table_b` 表按照 `column_a` 进行了 `GROUP BY` 操作
- 使用 `SUM()` 聚合函数处理 `column_b` 和 `column_c` 字段
- 确保每个 `column_a` 值只返回一条记录
2. 精确的连接条件
- `table_a` 与子查询结果 `summary` 通过 `column_a` 字段进行 `LEFT JOIN`
- 由于子查询中每个 `column_a` 值唯一,主表每条记录最多匹配一条子查询记录
- 避免了一对多的复杂关联关系
3. 数据去重机制
- 子查询预先对 `table_b` 中重复的 `column_a` 值进行聚合
- 即使 `table_b` 中存在多个相同 `column_a` 记录,也会被合并为单一记录
- 从根本上防止了笛卡尔积的产生
