SQL查询结果异常排查:PL分类52105及指定交易码筛选无效问题
SQL筛选结果不符合预期的原因分析
问题根源:逻辑运算符优先级与括号缺失
原SQL的WHERE子句因AND优先级高于OR,实际执行逻辑和需求完全不符:
数据库会把原WHERE解析为:
WHERE (PL_CATEGORY_CATEG_STMT IN ('52105')) OR (PL_CATEGORY_CATEG_STMT IS NULL AND TRANSACTION_CODE_STMT IN ('9007', '9803') AND REVERSAL_MARKER_STMT NOT LIKE 'R')
这意味着只要PL_CATEGORY_CATEG_STMT是'52105',不管TRANSACTION_CODE_STMT是什么值,都会被纳入结果集——这就是你看到其他交易码的直接原因。
而你的真实需求是:PL_CATEGORY_CATEG_STMT为'52105',同时满足交易码是'9007'/'9803'且反转标记不为'R',必须明确逻辑分组,避免优先级干扰。
修正后的SQL
如果仅按你描述的需求筛选,修正后代码如下:
FROM [Steward].[dbo].[vwNONFUNDED_RECOMP_04] WHERE PL_CATEGORY_CATEG_STMT IN ('52105') AND TRANSACTION_CODE_STMT IN ('9007', '9803') AND REVERSAL_MARKER_STMT NOT LIKE 'R' ORDER BY BOOKING_DATE_STMT
如果原SQL里的PL_CATEGORY_CATEG_STMT IS NULL也是你需要的筛选条件,需用括号明确分组逻辑:
FROM [Steward].[dbo].[vwNONFUNDED_RECOMP_04] WHERE (PL_CATEGORY_CATEG_STMT IN ('52105') OR PL_CATEGORY_CATEG_STMT IS NULL) AND TRANSACTION_CODE_STMT IN ('9007', '9803') AND REVERSAL_MARKER_STMT NOT LIKE 'R' ORDER BY BOOKING_DATE_STMT
内容的提问来源于stack exchange,提问作者Jimrosy P Madzokere
相关产品推荐
相关产品推荐

