SQL数据操作:基于起止周范围批量插入多行数据
解决方案:拆分周度合同到单个有效周记录
你可以通过**交叉连接(CROSS JOIN)**结合筛选条件实现需求:先让Load_Week的每条记录和Formatted_Week的所有周记录配对,再筛选出落在合同有效周范围内的结果。需要注意的是,你的数据里部分字段值带有末尾空格,得用TRIM()函数清理后再做比较,避免空格导致的匹配错误。
实现SQL
如果只想查询结果,使用以下语句:
SELECT lw.LOAD_ID, lw.Amount, fw.formatted_week FROM Load_Week lw CROSS JOIN Formatted_Week fw WHERE TRIM(fw.formatted_week) BETWEEN TRIM(lw.Valid_from) AND TRIM(lw.Valid_to) ORDER BY lw.LOAD_ID, fw.formatted_week;
如果需要创建新表存储结果:
CREATE TABLE Load_Week_Expanded AS SELECT lw.LOAD_ID, lw.Amount, TRIM(fw.formatted_week) AS formatted_week FROM Load_Week lw CROSS JOIN Formatted_Week fw WHERE TRIM(fw.formatted_week) BETWEEN TRIM(lw.Valid_from) AND TRIM(lw.Valid_to) ORDER BY lw.LOAD_ID, formatted_week;
优化建议
- 字段类型优化:
Amount字段存储数值,建议改成INT或DECIMAL类型,避免字符串操作带来的问题;- 周格式字段(
Valid_from、Valid_to、formatted_week)可考虑转换成标准周日期类型(如数据库支持的ISO_WEEK相关类型),或存储为YYYYWW格式的整数(如202244),让比较和计算更高效准确。
- 数据清洗:
- 插入数据时去掉末尾空格,避免后续每次查询都调用
TRIM(),影响性能。
- 插入数据时去掉末尾空格,避免后续每次查询都调用
- 性能提升:
- 若
Formatted_Week表数据量极大,可给formatted_week字段加索引,同时给Load_Week的Valid_from、Valid_to字段加索引,提升查询效率。
- 若
内容的提问来源于stack exchange,提问作者R.bitrary
相关产品推荐
相关产品推荐

