SQL-запрос между 3 таблицами - PullRequest
0 голосов
/ 29 ноября 2009

У меня есть 3 таблицы (обратите внимание, что это может быть не лучший дизайн sql db)

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

Мои входные параметры startdate и enddate. Я хотел бы знать отчетливый 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 ]

1 голос
/ 29 ноября 2009
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 голосов
/ 03 декабря 2009

Вы не хотите использовать 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 помогут нам помочь вам.

0 голосов
/ 29 ноября 2009

Комната: TypeName, RoomNumber RoomType: TypeName, ... Резервирование: StartDate, EndDate, TypeName, RoomNumber

Это может быть ваш ответ ...
выберите rt.typename
из номера r, тип номера rt, бронирование re
где r.typename = rt.typename
и rt.typename = re.typename
где re.startdate =: start_date
и re.enddate =: endate

0 голосов
/ 29 ноября 2009

неиспользованные типы номеров

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

один из способов выбора A-B - оператор «не в (выберите ..)», другой не существует (выберите ..), и я уверен, что будет еще больше.

...