如何为DimTime表添加节假日标识并更新HolidayInd字段?
更新DimTime表的HolidayInd字段解决方案
需求说明
- 已在
DimTime表新增HolidayInd字段,需根据Holidays表的节假日信息更新该字段:节假日标记为1,非节假日标记为0 DimTime表包含1900至2050年的全量日期数据Holidays表存储2000至2050年所有节假日的idDimTime标识
表结构示例
当前DimTime表状态
idDimTime FullTime HolidayInd 20000101 2000-01-01 NULL 20000102 2000-01-02 NULL 20000103 2000-01-03 NULL 20000104 2000-01-04 NULL 20000105 2000-01-05 NULL 20000106 2000-01-06 NULL 20000107 2000-01-07 NULL 20000108 2000-01-08 NULL 20000109 2000-01-09 NULL 200001010 2000-01-10 NULL
Holidays表数据
id idDimTime 1 20000101 2 20000110 3 20000320 4 20000420 5 20000421
期望更新后的DimTime表结果
idDimTime FullTime HolidayInd 20000101 2000-01-01 1 20000102 2000-01-02 0 20000103 2000-01-03 0 20000104 2000-01-04 0 20000105 2000-01-05 0 20000106 2000-01-06 0 20000107 2000-01-07 0 20000108 2000-01-08 0 20000109 2000-01-09 0 200001010 2000-01-10 1
更新SQL语句
你已经写出了关联查询的逻辑,在此基础上可以直接改成更新语句,以下提供两种常用写法:
写法1:JOIN式更新(适配MySQL、SQL Server等主流数据库)
直接利用左关联的结果更新字段:
UPDATE DimTime DT LEFT JOIN Holidays H ON H.IdDimTime = DT.IdDimTime SET DT.HolidayInd = CASE WHEN H.IdDimTime IS NULL THEN 0 ELSE 1 END WHERE DT.IdDimTime BETWEEN 20000101 AND 20501231;
写法2:子查询更新(通用语法,适配更多数据库类型)
如果你的数据库不支持JOIN更新,可以用存在性判断的子查询实现:
UPDATE DimTime SET HolidayInd = ( SELECT CASE WHEN EXISTS (SELECT 1 FROM Holidays H WHERE H.IdDimTime = DimTime.IdDimTime) THEN 1 ELSE 0 END ) WHERE IdDimTime BETWEEN 20000101 AND 20501231;
验证更新结果
执行更新后,可使用你原有的查询语句验证结果是否符合预期:
SELECT DT.IdDimTime ,CASE WHEN H.IdDimTime IS NULL THEN 0 ELSE 1 END AS HolidayInd FROM DimTime DT LEFT JOIN Holidays H ON H.IdDimTime = DT.IdDimTime WHERE DT.IdDimTime BETWEEN 20000101 AND 20501231 ORDER BY DT.IdDimTime;
内容的提问来源于Stack Exchange,提问作者Andres Mora
相关产品推荐
相关产品推荐

