【发布时间】:2012-08-05 17:16:15
【问题描述】:
一个看似简单的查询,我做不来......
两张桌子的房间和空房
Room [id, title, beds]
Availability [room_id, date, bed_delta]
一个房间有一个固定的最大可用床位数。可用性描述了Room.beds 被修改(向上或向下)的时间段。
我正在尝试构建一个查询,对于给定的房间和给定的开始日期和持续时间,将汇总可用床位。
例如:
- 1 号房间通常有 2 张床
- 1 小时,占用 1 张床
- 预期结果为 1
如果添加了与此日期时间范围重叠的另一个可用时间段,并将床位进一步减少 1,则预期结果为 0。
感觉是一个比较简单的查询:
- LEFT OUTER JOIN 房间到 room_id 的可用性
- 按日期限制
- 选择 Room.beds - sum(Availability.bed_delta)
即
SELECT r.beds - coalesce(sum(a.bed_delta), 0) as beds_free
FROM room r
LEFT OUTER JOIN availability a ON (r.id = a.room_id)
WHERE date = '2012-01-01 09:00:00+01:00'
AND r.id = 2
GROUP BY r.id;
此查询仅在availability 中存在匹配行时返回。我期望的是 id == 2 的房间只有一行。
【问题讨论】:
标签: postgresql outer-join