SQL-запрос - Где я иду не так? - PullRequest
5 голосов
/ 12 июня 2009

У меня есть два стола, один для открытий и другой для заказов. Запись в таблице бронирований всегда относится к открытию, и для каждого открытия может быть несколько бронирований. Я хотел бы извлечь все отверстия, которые имеют бронирование, отличное от bookingType 'C'.

например.

  1. если у открытия есть 3 бронирования типа A, B и C, оно НЕ должно отображаться в результате

  2. , если у открытия есть только заказы типа A и B, это должно появиться в результат

Вот то, что я пробовал, но это неверно, так как в примере 1 ничего не получается:

select op.id, bo.id 
  from opening op
  left join booking bo on bo.openingId = op.id
  where bo.bookingType != 'C';

Вот полный запрос, относящийся к временным интервалам:

select op.id, bo.id 
  from opening op
  left join booking bo on bo.openingId = op.id
  where ((bo.arrivalDate < '2009/06/20' AND bo.departureDate <= '2009/06/20') OR 
         (bo.arrivalDate >= '2009/06/27' AND bo.departureDate > '2009/06/27')) 

То, что я раньше называл bookingType, на самом деле было интервалом времени, определенным через два столбца arrivalDate и departureDate: в приведенном выше примере мне нужны все отверстия, которые НЕ имеют бронирования между 20th June 2009 и 27th June 2009.

Ответы [ 4 ]

7 голосов
/ 12 июня 2009
SELECT op.id 
FROM opening op 
WHERE op.id NOT IN 
     (SELECT b.openingid 
      FROM booking b 
      WHERE b.bookingtype='C')

с изменением даты:

SELECT op.id 
FROM opening op 
WHERE op.id NOT IN 
     (SELECT b.openingid 
      FROM booking b 
      WHERE (b.arrivalDate BETWEEN '2009/06/20' AND '2009/06/27') 
             OR 
            (b.departureDate BETWEEN  '2009/06/20' and '2009/06/27')
     )
2 голосов
/ 12 июня 2009

Вот простая версия без объединений, вам даже не нужна таблица Открытий:

select openingId, id
from booking
where openingId not in (
    select openingId
    from booking
    where bookingType = 'C'
)
1 голос
/ 12 июня 2009

@ Фрэнки - Нет необходимости в предложении NOT IN. Вы также можете использовать Left-Anti-Semi Join - как это:

SELECT op.id 
FROM opening op 
LEFT OUTER JOIN booking b ON op.id = b.openingid AND b.bookingtype = 'C'
WHERE b.OpeningID IS NULL

и это:

SELECT op.id 
FROM opening op 
LEFT OUTER JOIN booking b ON op.id = b.OpeningID
 AND b.ArrivalDate BETWEEN '2009/06/20' AND '2009/06/27'  
 AND b.DepartureDate BETWEEN '2009/06/20' AND '2009/06/27'
WHERE b.OpeningID IS NULL
0 голосов
/ 12 июня 2009
select opid, boid from 
   (select op.id opid, bo.id boid, bo.bookingType bookingType 
       from 
       openings op left outer join bookings bo on op.id = bo.id
   )
where bookingType <> 'C'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...