За исключением комментариев, которые я вставил в вопрос о том, как исключить уже заполненные резервирования или уже возвращенные кредиты ... Это СЛЕДУЕТ сделать для вас.
Я бы начал список, только посмотрев нате книги, которые люди зарезервировали.Зачем запрашивать и весь список книг, где никто не заинтересован в них ... ТО, расширяйте свои критерии.Внутренний запрос начинается непосредственно с книг в списке бронирования.То есть осталось присоединено к таблице ссуд (если на ссуде не осталось ни одного).Я извлекаю самую раннюю отметку времени для бронирования для каждой книги, а также получаю общее количество записей в книге LOAN, сгруппированных по номеру ISBN.
Из этого результата я немедленно повторно присоединяюсь к резервированиям для сопоставления на основеISBN и временная метка самого раннего, чтобы получить ВОЗ, которую он хотел.
Теперь финал ... ПРИСОЕДИНЯЙТЕСЬ (не СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ) к таблице книг как на ISBN, так и на вашем определителе, сколько доступных копий... меньше того, сколько уже сдано в аренду, составляет> 0.
Очевидно, что вы можете добавить заказ по предложению, как хотите.
УБЕДИТЕСЬ, что у вас есть индекс в таблице резервирований (bookISBN, отметка времени) для оптимизации запросов.Кроме того, таблица ссуд также должна иметь индекс ISBN.
SELECT
B.Title,
R2.readerID,
R2.timeStamp,
Wanted.AlreadyLoandedOut,
B.noOfCopies - Wanted.AlreadyLoanedOut as ShouldBeAvailable
FROM
( select
R.bookISBN,
MIN( R.timeStamp ) EarliestReservation,
COALESCE( COUNT( L.ID ), 0 ) as AlreadyLoanedOut
from
reservations R
LEFT JOIN Loans L
ON R.bookISBN = L.bookISBN
group by
R.bookISBN ) as Wanted
JOIN reservations R2
ON Wanted.bookISBN = R2.bookISBN
AND Wanted.EarliestReservation = R2.timeStamp
JOIN books B
ON Wanted.bookISBN = B.ISBN
AND B.noOfCopies - Wanted.AlreadyLoanedOut > 0