SQL对比req_table与admins_table同名列查询结果异常求助
SQL查询逻辑错误修正方案
原有语句错误点
- 逻辑连接符错误:
WHERE子句使用OR拼接条件,只要满足stat_id not in (3)就会直接返回数据,完全跳过prev字段匹配校验,是结果不符合预期的核心原因 - 匹配规则错误:原有子查询逻辑为任意1个prev字段相等即可返回id,不符合要求的「5个prev字段全部相等」规则
- 多余限制条件:子查询额外添加了
admins_table.[prev_x] = 1的过滤规则,需求无此要求,会错误拦截符合条件的数据 - 语法错误:SELECT字段列表末尾多了冗余逗号,子查询中引用了不存在的
req_table.req_id字段(req_table主键字段为id) - 执行效率低下:多个重复子查询反复关联两张表,资源消耗远高于正常写法
修正后的查询语句
SELECT DISTINCT r.id, r.stat_id, r.prev_1, r.prev_2, r.prev_3, r.prev_4, r.prev_5 FROM req_table r INNER JOIN admins_table a ON r.prev_1 = a.prev_1 AND r.prev_2 = a.prev_2 AND r.prev_3 = a.prev_3 AND r.prev_4 = a.prev_4 AND r.prev_5 = a.prev_5 WHERE r.stat_id != 3 AND a.admin_name = 'admin3'
逻辑说明
通过内连接一次性关联两张业务表,将5个prev字段全相等作为关联条件,同时完成stat_id≠3和指定管理员的过滤,逻辑清晰且执行效率更高。如果确实需要保留prev字段等于1的限制,可在WHERE子句中补充对应条件即可。
内容的提问来源于stack exchange,提问作者jim
相关产品推荐
相关产品推荐

