SQL查询问题:筛选NULL值却返回非NULL结果,WHERE子句排查求助
问题分析与修正方案
核心问题点
- 逻辑运算符优先级混乱:WHERE子句中的OR条件未用括号包裹,导致只要
ATTR.AttributeName匹配三个值中的任意一个,就会绕过前面的ATTR.[Value]非空判断等约束,这是结果包含非NULL值的主要原因。 - NULL值判断语法错误:SQL中判断字段为NULL必须使用
IS NULL,原语句中的ATTR.[Value] = 'NULL'是判断字段值等于字符串'NULL',而非真正的空值。 - 关联条件无效:最后一个LEFT JOIN的ON条件
FI.InvoiceDateInt = CAL.DateInt与之前的关联重复,未关联产品维度表的核心字段,会产生冗余数据。
修正后的SQL语句
SELECT DISTINCT ATTR.ItemCode, ATTR.AttributeName, ATTR.[Group], ATTR.[Value], MFR.ManufacturerCode FROM [CloudDWDB].[dbo].[Dimension_Product_Attributes_P360] ATTR WITH (NOLOCK) LEFT JOIN [CloudDWDB].[dbo].[Fact_Invoice] FI WITH (NOLOCK) ON ATTR.ItemCode = FI.ItemCode INNER JOIN [CloudDWDB].[dbo].[Dimension_CalendarDate] CAL WITH (NOLOCK) ON FI.InvoiceDateInt = CAL.DateInt LEFT JOIN [CloudDWDB].[dbo].[Dimension_Product_P360] MFR WITH (NOLOCK) ON ATTR.ItemCode = MFR.ItemCode -- 修正关联条件,关联产品编码 WHERE ATTR.isActive = 1 AND ATTR.[Value] IS NULL -- 修正NULL值判断 AND FI.TransactionCode = 'IN' AND FI.SalesQuantity > 0 AND CAL.YearsAgo IN (0, 1, 2, 3) AND FI.CompanyCode IN ('01', '02') AND ( -- 用括号包裹OR条件,保证逻辑优先级 ATTR.AttributeName = 'Processor Number' OR ATTR.AttributeName = 'Platform Technology' OR ATTR.AttributeName = 'Processor Brand' )
内容的提问来源于stack exchange,提问作者casecha
相关产品推荐
相关产品推荐

