-1

我有 3 个表(注意这可能不是最好的 sql db 设计)

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?也许某种NOT_CONTAINS功能?

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

4

4 回答 4

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)
于 2009-11-29T07:33:40.887 回答
0

未使用的房间类型

select RT.* 
from RoomType RT
where RT.TypeName not in (
   Select RM.TypeName 
   from Room RM
) 

进行 AB 选择的一种方法是“不在 (select ..)”运算符中,不存在 (select ..) 是另一种方法,我敢肯定,还会有更多。

于 2009-11-29T07:34:46.417 回答
0

房间:TypeName、RoomNumber RoomType:TypeName、... 预订:StartDate、EndDate、TypeName、RoomNumber

这可能是你的答案... 从房间 r 中
选择 rt.typename ,roomtype rt,reservation re where r.typename=rt.typename and rt.typename=re.typename where re.startdate=:start_date and re.enddate=:结束





于 2009-11-29T08:06:42.243 回答
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

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

于 2009-12-03T04:32:47.353 回答