Oracle SQL多表联接返回重复项

时间:2020-03-03 00:26:03

标签: sql database oracle join

我的模式是:

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

1 个答案:

答案 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子句,因此它允许数据库利用涉及日期列的索引(如果有)。