以下表格是关系型DBMS中保存的数据库的一部分: -
Hotel (hotelNo, hotelName, city)
Room (roomNo, hotelNo, type, price)
Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo)
Guest (guestNo, guestName, guestAddress)
其中酒店包含酒店详情,hotelNo是主要关键; 房间包含每个酒店的房间详细信息,(roomNo,hotelNo)构成主键; 预订包含预订的详细信息,并且(hotelNo,guestNo,dateFrom)构成主要预订 键;访客包含访客详细信息,guestNo是主键。
如果我想选择居住在伦敦的所有客人的姓名和地址,我必须使用哪种类型的加入?从逻辑的角度来看,我有一个理论,我必须在所有表格中工作,而不仅仅是那些包含' guestName',' guestAddress'和' city'但是如何在一个查询中执行此操作让我感到困惑。
答案 0 :(得分:0)
每当您有一个恐吓您并且需要多个表的查询时,最好将其分成多个部分并将其重新组合在一起。
例如,您要求的第一部分是:
选择所有客人的姓名和地址..
您可以先编写一个查询来执行此操作。这是一个简单的选择声明:
SELECT g.guestName, g.guestAddress
FROM guest g;
接下来,您需要找到住在伦敦的客人。不幸的是,我们无法直接跳转到Hotel
表,因为它没有引用Guest
。但是,Booking
与两者相关,因此我们可以在guestNo
列匹配的条件下加入预订表,然后在hotelNo
匹配的条件下加入酒店表。最后,添加酒店在伦敦的条件:
SELECT g.guestName, g.guestAddress
FROM guest g
JOIN booking b ON b.guestNo = g.guestNo
JOIN hotel h ON h.hotelNo = b.hotelNo AND h.city= 'London';
此查询不做的是防止客人多次入住酒店的情况。在这种情况下,您似乎希望目前的客人居住在伦敦,因此您可以添加另一个条件dateTo
是今天或之后的日期,就像这样:
SELECT g.guestName, g.guestAddress
FROM guest g
JOIN booking b ON b.guestNo = g.guestNo AND b.dateTo >= CURDATE();
JOIN hotel h ON h.hotelNo = b.hotelNo AND h.city= 'London';