CROSS JOIN
生成两个表的笛卡尔积。
简介
CROSS JOIN 生成左表每一行与右表每一行的全部组合,因此结果行数等于两边行数的乘积。它适合生成日期×地区、产品×规格等完整组合,但在大表上会迅速放大数据量;如果原意是按键匹配,缺少 ON 条件通常就是错误。
基础语法
SELECT a.name, b.name FROM table_a a CROSS JOIN table_b b;
示例
CROSS JOIN 示例
示例把 table_a 的 2 行与 table_b 的 2 行组合成 4 行,用结果数量直接验证笛卡尔积。
示例数据表
表名:
table_a| name |
|---|
| A |
| B |
表名:
table_b| name |
|---|
| X |
| Y |
SQL
SELECT a.name AS a_name, b.name AS b_name FROM table_a a CROSS JOIN table_b b;
运行结果
| a_name | b_name |
|---|---|
| A | X |
| A | Y |
| B | X |
| B | Y |
常见问题
CROSS JOIN 会返回多少行?
在没有后续过滤时,结果行数等于两侧行数的乘积,例如 100 行与 1,000 行会产生 100,000 行。
什么场景适合主动使用 CROSS JOIN?
生成日期与门店的完整组合、测试数据或所有候选组合时很有用,但应先估算结果规模。
怎样控制笛卡尔积的成本?
先在子查询或 CTE 中过滤两侧输入,只保留必要字段,并用 LIMIT 或样例数据验证预计行数。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。