SQL关联BaseDipline模板表与真实表缺失匹配行问题求解
问题原因
- 关联方式使用了
INNER JOIN,仅返回两张表满足关联条件的匹配行,模板表中无对应业务数据的行直接被过滤,需改为LEFT JOIN保留模板表的全部行。 - 原SQL将业务表的日期筛选写在WHERE子句中,LEFT JOIN后无匹配的行
PackDate为NULL,会被WHERE条件过滤,等同于变回INNER JOIN的效果,需要将日期筛选挪到JOIN的关联条件中。 - 无匹配数据时需要用
ISNULL/COALESCE函数处理字段,将NULL值替换为模板表的默认值0和指定查询日期。
修改后的代码
DECLARE @Date VARCHAR(100)=CONVERT(varchar,getdate(),110) SELECT base.PackingStation, ISNULL(summary.PackDate, @Date) AS PackDate, base.[Shift], ISNULL(summary.Qty, base.Qty) AS Qty FROM [MKE_PSS].[dbo].[BaseDipline] base LEFT JOIN [MKE_PSS].[dbo].[vwDipLinePackingActivity_Summary] summary ON base.PackingStation = summary.PackingStation AND base.[Shift] = summary.[Shift] AND summary.PackDate = @Date ORDER BY base.PackingStation, base.[Shift]
这里给两张表加了别名简化写法,查询逻辑保留了模板表的全部行,有匹配的业务数据时取业务表的Qty值,无匹配时保留模板表默认的0值,同时所有行的日期统一为你设置的查询日期,输出顺序也对齐预期结果按产线+班次排序。
内容的提问来源于stack exchange,提问作者alfonso2330
相关产品推荐
相关产品推荐

