SQL中Cross Join的实用场景困惑及具体示例需求
SQL Cross Join 实际应用场景示例
场景1:电商商品SKU规格组合生成
很多电商商品会有多个属性(比如颜色、尺寸),需要生成所有属性组合的SKU(库存保有单位),这时候Cross Join就是最直接的解决方案。
假设我们有两个表:
product_colors:存储商品可选颜色product_sizes:存储商品可选尺寸
先创建并插入测试数据:
-- 创建颜色表 CREATE TABLE product_colors ( color_id INT PRIMARY KEY, color_name VARCHAR(20) ); INSERT INTO product_colors VALUES (1, '黑色'), (2, '白色'), (3, '藏青色'); -- 创建尺寸表 CREATE TABLE product_sizes ( size_id INT PRIMARY KEY, size_name VARCHAR(10) ); INSERT INTO product_sizes VALUES (1, 'S'), (2, 'M'), (3, 'L'), (4, 'XL');
现在要生成所有颜色和尺寸的组合,用来创建SKU,用Cross Join实现:
SELECT c.color_name, s.size_name, CONCAT(c.color_name, '-', s.size_name) AS sku_code FROM product_colors c CROSS JOIN product_sizes s;
执行后会得到12条结果(3种颜色 × 4种尺寸),示例结果:
| color_name | size_name | sku_code |
|---|---|---|
| 黑色 | S | 黑色-S |
| 黑色 | M | 黑色-M |
| 黑色 | L | 黑色-L |
| 黑色 | XL | 黑色-XL |
| 白色 | S | 白色-S |
| ... | ... | ... |
这个场景里,我们不需要两个表之间的关联条件,只需要所有属性的笛卡尔积,Cross Join完美匹配需求。
场景2:门店排班基础表生成
假设公司有5家门店,需要为每家门店生成未来7天的排班记录框架,后续再填充值班人员。这时候可以用日期表和门店表做Cross Join。
先创建测试表:
-- 创建门店表 CREATE TABLE stores ( store_id INT PRIMARY KEY, store_name VARCHAR(50) ); INSERT INTO stores VALUES (1, '北京朝阳店'), (2, '上海浦东店'), (3, '广州天河店'), (4, '深圳南山店'), (5, '杭州西湖店'); -- 生成未来7天的日期表(这里用CTE临时生成,实际也可以用日历表) WITH date_range AS ( SELECT DATE_ADD(CURDATE(), INTERVAL n DAY) AS shift_date FROM ( SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) AS nums )
用Cross Join生成所有门店-日期的组合:
SELECT s.store_id, s.store_name, d.shift_date, '待安排' AS duty_staff FROM stores s CROSS JOIN date_range d ORDER BY s.store_id, d.shift_date;
执行后会得到35条结果(5家门店 × 7天),每条记录对应一个门店的某天排班框架,后续可以直接更新duty_staff字段添加值班人员。
内容的提问来源于stack exchange,提问作者nants
相关产品推荐
相关产品推荐

