2009-11-29 41 views
-1

我有3个表(注意,这可能不是最好的SQL数据库设计)SQL查询表之间的3

Room: TypeName, RoomNumber 
RoomType: TypeName, ... 
Reservation: StartDate, EndDate, TypeName, RoomNumber 

我的输入参数为startdateenddate。我想知道可用的不同roomtypes。从我的理解的解决方案是这样的:AvailableRoomTypes = AllRoomTypes - UnavailableRoomTypes

显然AllRoomTypes可以发现:SELECT DISTINCT(TypeName) FROM Room; ,我知道怎么去不可的房间,但不是不可用roomtypes。我也不知道如何从另一套中减去一套。我可以得到一组所有rooms+roomtypes和另一组不可用rooms+roomtypes,但我如何加入它们使得它是A-B?也许某种函数?

我想我的输出参数是SELECT * FROM RoomType (for the appropriate roomtypes)

+0

什么数据库,你可以更明显什么是表和它的列是什么? –

+0

这是我有: SELECT r.roomtype,s.servicename 从预订[R JOIN BILLING B关于b.reservationid = r.reservationid 和b.paid = 1 JOIN Customer_SERVICE S于s.customerserviceid = b.customerserviceid ; 我需要为每个不同的reservation.roomtype和customer_service.servicename计算billing.total。所以我想要: 选择SUM(b.total)作为保留... 加入 为服务选择SUM(b.total)... ? – Stuart

回答

0

未使用RoomTypes

做AB选择
select RT.* 
from RoomType RT 
where RT.TypeName not in (
    Select RM.TypeName 
    from Room RM 
) 

一种方法是 “没有(选择..)” 操作,不存在(选择..)是另一个将会有更多的,我我确定。

+0

也可以使用差异联盟 –

+0

@Russ Cam:我不知道'差异联盟'联盟是什么(谷歌表示它也不是)!你是否愿意发表一个解答OP的问题来证明“差异联盟”?但是你的观点已经被采纳,我的回答听起来似乎是绝对的,好像'不是'是解决OP问题的唯一方法。会改变! – lexu

+0

差异工会TSQL: 选择等等等等 EXCEPT 选择等等等等 – Hogan

1
SELECT t.* 
    FROM ROOMTYPE t 
WHERE NOT EXISTS(SELECT NULL 
        FROM RESERVATION r 
        JOIN ROOM ro ON ro.roomnumber = r.roomnumber 
        WHERE ro.typename = t.typename 
        AND r.startdate BETWEEN ?IN_START_DATE AND ?IN_END_DATE 
        AND r.enddate BETWEEN ?IN_START_DATE AND ?IN_END_DATE) 
0

客房:类型名,RoomNumber RoomType:类型名,...预约:开始日期,结束日期,类型名,RoomNumber

这可能是你的答案...
选择rt.typename
从房屋R, roomtype室温,保留重
其中r.typename = rt.typename
和rt.typename = re.typename
其中re.startdate =:START_DATE
和re.enddate =:endate

0

你不想使用UNION - SUM(reservation.roomtype)SUM(service.servicetype)是不同的属性。但是,如果你这样做了,你会希望使用NULL来弥补查询,所以列不重叠。 IE:

SELECT SUM(reservation.roomtype), NULL ... 
UNION ALL 
SELECT NULL, SUM(service.servicetype) ... 

根据您提供的逻辑,这是我想出了查询:

SELECT SUM(r.roomtype), 
     SUM(s.servicetype) 
    FROM RESERVATION r 
    JOIN BILL b ON b.reservationid = r.reservationid 
      AND b.paid = 1 
    JOIN SERVICE s ON s.serviceid = b.serviceid 

这将返回一行。为了返回更有意义的结果集,我们需要知道查询(或查询取决于信息)的组。 RESERVATIONSERVICE表格的详细信息将有助于我们为您提供帮助。