这个SQL语句应该如何写?(300分)

  • 主题发起人 主题发起人 Thinboy
  • 开始时间 开始时间
T

Thinboy

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有三个表,表名和字段如下描述
1. 表: 房间 (Room)
字段: 房间编号 (Room_ID)
2. 表: 房间使用状态 (Room_Use)
字段: 房间编号 (Room_ID)
客人编号 (Guest_ID)
3. 表: 消费记录 (Guest_Service)
字段: 房间编号 (Room_ID)
客人编号 (Guest_ID)
服务项目 (Service)

表1(房间)是所有房间的记录,包括所有房间的编号
表2(房间使用状态)是房间的使用情况,如果有客人在房间,那么才会存在这么一个记录
房间编号--客人编号
表3(消费记录)记录每个客人在某个房间的消费情况,客人有消费才会有记录

现在需要使用一个SQL语句来查询,表1(房间)所有房间的情况,包括房间里有什么客人,
这些客人有什么消费记录,注意,房间不一定有客人,客人不一定有消费记录

想了一个晚上,试了很多次的SQL语句,还是不能使用SQL语句一次性解决,所以只能发贴,
向各位前辈请教,谢谢!
 
select room.id, guest_service.guest_id,guest_service.service
from room, room_use,guest_service, guest_service
where room.id*=room_use.id and room_use.guest_id*=guest_service.guest_id

两个左连接,应该可以搞定了。
 
select A.room_id,A.room,B.guest_id,C.service
from room A, room_use B,guest_service C
where A.room_id=B.room_id and B.guest_id*=C.guest_id --所有住客人的房间情况
union
select A.room,'',''
from room A
where A.room_id not in (select room_id from room_use) --所有未住客人的房间情况
order by A.room_id

 
select a.room_id,b.guest_id,c.service
from room a left join room_use b on a.room_id=b.room_id
left join guest_service c on a.room_id=c.room_id and b.guest_id=c.guest_id
 
Adnil的语句是否多了一个表名Guest_Service ?

两个左连接我已经试过,我刚才也试了一下你的语句,返回

服务器: 消息 301,级别 16,状态 1,行 1
查询中包含不允许的外联接请求。

hb_wshsh的回答正确,能够解决问题,这个做法和我昨晚关机后想到的一样,使用并集而
不使用外联接,我也实在太笨了

谢谢hb_wshsh, 谢谢Adnil

 
我结束贴子后才发现ugvanxk的贴子,很对不起,我试了一下ugvanxk的句子,证明也可以的

但由于我在Guest_Server有一个查询条件,而ugvanxk的句子包含这个查询条件后,出来的结果
集就和hb_wshsh的不一样了

再请教一下ugvanxk, 使用的left join能否转变成*= ??
 
这两种方法完全等价
 
后退
顶部