SQL查询筛选LAB_ORD.Order_Status仅返回F、C不生效问题咨询
问题排查与解决方案
故障根因
问题出在SQL逻辑运算符的优先级规则:AND的运算优先级高于OR,你写的WHERE条件会被SQL引擎按如下逻辑解析执行:
WHERE (Test_Code = '139901') OR (Test_Code LIKE '164073') OR (Test_Code LIKE '%sars%') OR ( (Test_Code LIKE '%covid%') AND LAB_ORD.Order_Status IN ('F', 'C') AND (Result NOT LIKE '.') )
也就是说,只要记录满足前三个Test_Code判断中的任意一个,不管Order_Status是什么值,都会被查询返回,这就是你过滤规则不生效的原因。
修正方案
将所有Test_Code相关的判断用括号包裹为一个独立条件组,让整组条件和后续的Order_Status、Result过滤条件为AND关联关系,修正后的WHERE部分代码如下:
WHERE ( Test_Code = '139901' OR Test_Code LIKE '164073' OR Test_Code LIKE '%sars%' OR Test_Code LIKE '%covid%' ) AND LAB_ORD.Order_Status IN ('F', 'C') AND Result NOT LIKE '.'
可选优化点
Test_Code LIKE '164073'没有通配符,和Test_Code = '164073'效果完全一致,可以直接换成等于判断提升执行效率- 所有关联表的字段建议带上表别名,避免多表同名字段导致的执行异常,比如Test_Code可以写成
LT.Test_Code,Result可以写成LR.Result
内容的提问来源于stack exchange,提问作者SQLCoder
相关产品推荐
相关产品推荐

