SQL 生成日期与产品的所有组合:CROSS JOIN(笛卡尔积)
CROSS JOIN(笛卡尔积)是一种 SQL 连接方式,它会将 第一个表的每一行 与 第二个表的每一行 进行组合,生成所有可能的配对。
如果表 A 有
m
行,表 B 有n
行,那么A CROSS JOIN B
的结果会有m × n
行。不依赖任何连接条件(没有
ON
或WHERE
子句),直接组合所有数据。
-- 显式 CROSS JOIN
SELECT * FROM table1 CROSS JOIN table2;-- 隐式 CROSS JOIN(用逗号分隔表)
SELECT * FROM table1, table2;
虽然笛卡尔积通常会导致数据量爆炸(慎用!),但在特定场景下很有价值:
生成所有可能的组合。
计算排列组合或矩阵。例如:统计不同性别和年龄段的用户分布。
测试数据生成。快速创建大量测试数据(如压力测试)。
场景: 生成日期与产品的所有组合
-- 生成日期序列的递归CTE(MySQL 8.0+)
WITH RECURSIVE date_range AS (SELECT '2023-01-01' AS dateUNION ALLSELECT DATE_ADD(date, INTERVAL 1 DAY) FROM date_range WHERE date < '2023-01-05'
)
SELECT d.date,p.product_id,p.product_name
FROM date_range d
CROSS JOIN products p
ORDER BY d.date, p.product_id;
思路:
- 用递归CTE
date_range
生成连续日期序列。 - 通过
CROSS JOIN
将每个日期与产品表中的所有记录组合。
建表示例:
CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(100) NOT NULL
);INSERT INTO products (product_id, product_name) VALUES
(1, 'Laptop'),
(2, 'Smartphone'),
(3, 'Headphones');