基于另一张表数值过滤SQL结果 嵌套SQL查询空置套房返回空值求助
SQL问题排查及修正方案
错误根源
你编写的语句核心问题出在NOT EXISTS的子查询逻辑:
- 子查询没有和外层的
executiveSuites表做字段关联,是全局扫描executiveLease全表判断是否存在状态为1的租约。只要全表有任意一条状态为1的租约,NOT EXISTS的返回结果就为假,最终整个查询的结果自然为空。
修正方案
方案1:保留EXISTS嵌套的写法
给子查询加上和外层套房表的关联条件,确保是逐个校验单套房有没有有效租约:
SELECT * FROM `executiveSuites` LEFT JOIN `executiveLease` ON executiveLease.suiteNumber = executiveSuites.SuiteNumber AND executiveLease.Property = executiveSuites.BuildingID WHERE NOT EXISTS ( SELECT * FROM `executiveLease` WHERE executiveLease.suiteNumber = executiveSuites.SuiteNumber AND executiveLease.Property = executiveSuites.BuildingID AND executiveLease.status = 1 )
方案2:简化为LEFT JOIN空值判断(无需嵌套)
把状态为1的租约筛选条件直接放到JOIN匹配逻辑中,通过关联结果为空判断套房空置:
SELECT DISTINCT executiveSuites.* FROM `executiveSuites` LEFT JOIN `executiveLease` ON executiveLease.suiteNumber = executiveSuites.SuiteNumber AND executiveLease.Property = executiveSuites.BuildingID AND executiveLease.status = 1 -- 此处替换为executiveLease表的非空主键字段即可 WHERE executiveLease.id IS NULL
说明:加DISTINCT是为了避免单套房存在多条历史租约时出现重复数据。
额外排查方向
如果修正后结果仍不符合预期,可以按顺序做基础校验:
- 单独执行
SELECT * FROM executiveLease WHERE status = 1,确认状态为1的租约记录的suiteNumber、Property字段值,和套房表的SuiteNumber、BuildingID字段值完全匹配,注意部分数据库对字段大小写、字符前后空格敏感 - 暂时去掉WHERE条件执行JOIN查询,确认两张表的关联逻辑是正确的,没有字段匹配错误
内容的提问来源于stack exchange,提问作者KingMalaka
相关产品推荐
相关产品推荐

