咨询带Num=6过滤的两表关联字段值差异查询SQL正确性
查询语句适配性校验
你编写的查询语句在字段无NULL值、数据库对比规则和业务判定完全一致的常规场景下,完全可以实现需求。但实际生产使用时有几个容易导致结果偏差的边界问题需要留意:
基础逻辑匹配校验
逐行对照业务要求,语句的逻辑覆盖是完整的:
- 通过
INNER JOIN ... ON id = uid实现两表按id和uid等值关联,仅保留两表取值相等的关联记录 - 通过
fs != FSFG筛选对应行两个字段值存在差异的记录 - 通过
Num = 6过滤出t1表Num字段取值为6的记录
易导致结果偏差的边界问题
这些是实际执行中很容易踩的坑,会让最终返回的记录不符合业务预期:
- 字段存在NULL值时判断失效
SQL遵循三值逻辑,任何值和NULL做!=对比的结果都是UNKNOWN,这类记录不会被WHERE条件捕获:如果某条关联记录里t1.fs是NULL、t2.FSFG是具体非空值,本质上两个值是存在差异的,但原语句的判断逻辑会直接跳过这类记录,不会将其纳入结果集。
如果需要兼容这类NULL值的差异判断,可以把对比逻辑替换为不受三值逻辑影响的写法,比如MySQL的<=>空安全等值判断,或者标准SQL的IS DISTINCT FROM语法。 - 数据库默认对比规则和业务判定不匹配
如果fs和FSFG是字符串类型,数据库默认的排序规则(collation)可能会在无感知的情况下自动忽略大小写差异、首尾空格差异:比如业务上认为fs值abc和FSFG值ABC是不一样的,但数据库默认不区分大小写的规则会判定二者相等,导致本该被筛选出来的差异记录被漏掉。
优化提示
你当前的语句没有给字段加表名前缀,后续如果两个表新增了同名字段,执行时会直接报“字段存在歧义”的错误,建议调整为无歧义的稳妥写法:
-- 兼容NULL判断、无字段歧义的通用写法 SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.uid WHERE NOT t1.fs <=> t2.FSFG AND t1.Num = 6
内容的提问来源于stack exchange,提问作者Lightsout
相关产品推荐
相关产品推荐

