我的模式是:
Hotel (hotelNo, hotelName, city)
Room (roomNo, hotelNo, type, price)
Booking (hotelNo, guestNo, dateFr, dateTo, roomNo)
Guest (guestNo, guestName, guestAddress)
如果要在我为特定酒店添加条件的日期内房间被占用,我想显示所有房间详细信息和guestName。
我可以进行查询以显示满足以下条件的hotelNo,hotelName,city和guestName:
select h.hotelNo, h.hotelName, h.city, g.guestName
from Hotel h
join Booking b on (h.hotelNo = b.hotelNo)
join Guest g on (b.guestNo = g.guestNo)
where h.hotelName = 'Grouse Hotel'
and TO_DATE('04-Jan-2020') between b.dateFrom and b.dateTo;
以上返回唯一的一条记录。
1 Grouse Hotel London Marie King
但是,当我现在尝试获取房间信息而不是我需要的信息时,我在Grouse Hotel的三种类型的房间中得到了3个人同一个客人。
select r.roomNo, r.hotelNo, r.room_type, r.price, g.guestName
from Room r
join Hotel h on (h.hotelNo = r.hotelNo)
join Booking b on (r.hotelNo = b.hotelNo)
join Guest g on (b.guestNo = g.guestNo)
where TO_DATE('04-Jan-2020') between b.dateFrom and b.dateTo
and h.hotelName = 'Grouse Hotel';
返回
1 1 single 120 Marie King
2 1 double 200 Marie King
3 1 suite 500 Marie King
答案 0 :(得分:1)
第二个查询缺少预订和房间之间的联接条件,因此它将每个预订与相关酒店中的所有房间相关联。
考虑:
select r.roomNo, r.hotelNo, r.room_type, r.price, g.guestName
from Room r
join Hotel h on h.hotelNo = r.hotelNo
join Booking b on r.hotelNo = b.hotelNo and r.roomNo = b.roomNo
join Guest g on b.guestNo = g.guestNo --^-- here
where
b.dateFrom <= DATE'2020-01-04' and b.dateTo >= DATE'2020-01-04'
and h.hotelName = 'Grouse Hotel';
请注意,我重写了您的where
子句,因此它允许数据库利用涉及日期列的索引(如果有)。