SQL 生成日期与产品的所有组合:CROSS JOIN(笛卡尔积)

CROSS JOIN​ ​(笛卡尔积)是一种 SQL 连接方式,它会将 ​​第一个表的每一行​ ​ 与 ​​第二个表的每一行​​ 进行组合,生成所有可能的配对。

  • 如果表 A 有 m行,表 B 有 n行,那么 A CROSS JOIN B的结果会有 m × n行。

  • ​不依赖任何连接条件​ ​(没有 ONWHERE子句),直接组合所有数据。

sql 复制代码
-- 显式 CROSS JOIN
SELECT * FROM table1 CROSS JOIN table2;

-- 隐式 CROSS JOIN(用逗号分隔表)
SELECT * FROM table1, table2;

虽然笛卡尔积通常会导致数据量爆炸(慎用!),但在特定场景下很有价值:

  1. ​生成所有可能的组合。

  2. **计算排列组合或矩阵。**例如:统计不同性别和年龄段的用户分布。

  3. ​测试数据生成​​。快速创建大量测试数据(如压力测试)。


​场景​​: 生成日期与产品的所有组合

sql 复制代码
-- 生成日期序列的递归CTE(MySQL 8.0+)
WITH RECURSIVE date_range AS (
    SELECT '2023-01-01' AS date
    UNION ALL
    SELECT 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 将每个日期与产品表中的所有记录组合。

​建表示例​​:

sql 复制代码
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');