SQL统计指定房间各床型数量时无匹配项返回0的实现方法
问题根源与调整方案
原有SQL的核心问题
- 连接方向颠倒:原语句从
room_bed表出发左连bedtype,遍历基准是房间实际存在的床记录,未在目标房间配置的床型(比如Single)从数据源层面就没有进入结果集的可能。 - 过滤条件位置错误:左连接完成后在WHERE子句直接过滤
room_bed.roomID = 3,会把左连接补全的、room_bed侧全为NULL的无匹配床型行直接剔除,哪怕调整了连接方向,不修正条件位置也无法拿到完整统计结果。
可直接使用的调整后SQL
SELECT bt.bedTypeName AS Name, COUNT(rb.bedTypeID) AS COUNT FROM bedType bt LEFT JOIN room_bed rb ON rb.bedTypeID = bt.ID AND rb.roomID = 3 GROUP BY bt.bedTypeName
执行逻辑说明
- 以存储全量床型基础信息的
bedType表作为左连接主表,从数据源层面保证所有预设床型都会出现在最终结果中 - 将
roomID=3的房间过滤规则放到LEFT JOIN的ON匹配条件中:只有当床型在ID为3的房间存在关联配置时,才会匹配到对应的room_bed记录;无匹配记录的床型,对应的room_bed字段值全为NULL - 统计计数时使用
COUNT(rb.bedTypeID),SQL内置计数规则会自动忽略NULL值,无匹配配置的床型自然会返回0值,不需要额外通过IF/NVL等函数做空值转换
内容的提问来源于stack exchange,提问作者MMMMMMM
相关产品推荐
相关产品推荐

