编写SQL SELECT查询:判断城市所有房屋的has_door属性是否全为true
解决思路与SQL实现
嘿,这个需求其实挺常见的,我来给你几个实用的解决方案,分不同场景说明:
1. 查看所有城市的状态(返回每个城市是否所有房源都有门)
如果需要一次性获取所有城市的判定结果,下面两种方法都能搞定:
方法1:分组统计法
SELECT c.city_id, c.city_name, -- 统计当前城市中has_door为false的房源数量,若为0则返回true CASE WHEN COUNT(CASE WHEN h.has_door = false THEN 1 END) = 0 THEN true ELSE false END AS all_houses_have_door FROM city c -- 左连接保留没有房源的城市(若不需要这类城市,换成INNER JOIN即可) LEFT JOIN house h ON c.city_id = h.city_id GROUP BY c.city_id, c.city_name;
逻辑说明:通过嵌套CASE语句筛选出不符合条件的房源,统计数量为0就意味着所有房源都满足has_door=true。左连接能确保没有房源的城市也会出现在结果里(这类城市会被判定为true,因为不存在不符合条件的房源)。
方法2:NOT EXISTS子查询法(性能更优)
SELECT c.city_id, c.city_name, -- 子查询检查当前城市是否存在has_door=false的房源,不存在则返回true NOT EXISTS ( SELECT 1 FROM house h WHERE h.city_id = c.city_id AND h.has_door = false ) AS all_houses_have_door FROM city c;
逻辑说明:NOT EXISTS会提前终止子查询的执行——只要找到一个has_door=false的房源,就不再继续检查该城市的其他房源,在数据量较大时,这个方法的性能比分组统计法要好很多。
2. 只返回满足条件的城市
如果只需要筛选出所有房源都有门的城市,直接在WHERE中使用NOT EXISTS即可:
SELECT c.city_id, c.city_name FROM city c WHERE NOT EXISTS ( SELECT 1 FROM house h WHERE h.city_id = c.city_id AND h.has_door = false );
3. 检查单个特定城市的状态
如果只需要判断某一个特定城市是否所有房源都有门,简化一下查询就行:
-- 把:target_city_id替换成你要检查的城市ID SELECT NOT EXISTS ( SELECT 1 FROM house h WHERE h.city_id = :target_city_id AND h.has_door = false ) AS all_houses_have_door;
内容的提问来源于stack exchange,提问作者Adolis Pali
相关产品推荐
相关产品推荐

