我在SQL Server中建立了一个酒店预订数据库。表中的三个是如下:SQL太复杂的嵌套查询 - 你能简化一下吗?
相关列的表中有:
Booking
:BookingID
(PK),CheckInDate
,CheckoutDate
RoomBooking
:RoomBookingID
(PK),FK_Booking_ID
(FK),FK_RoomID
(FK)Room
:RoomID
(PK)
现在我写了一个SQL查询(如下所示),试图找出在某个日期(2017-10-02到2017-10-04)哪些房间是免费的。代码解决了这个问题,但变得非常复杂。我知道如何通过在表RoomBooking
中使CheckInDate
和CheckOutDate
更容易地解决这个问题,但我希望此设置能够正常工作。你有什么想法如何简化下面的代码?
BR /麦克
SELECT FK_RoomID
FROM RoomBooking
WHERE FK_RoomID IN
(SELECT FK_RoomID
FROM RoomBooking
WHERE FK_BookingID NOT IN
(SELECT BookingID
FROM Booking
WHERE CheckInDate <= '2017-10-04'
AND CheckOutDatum > '2017-10-02')
)
AND FK_RoomID NOT IN
(SELECT FK_RoomID
FROM RoomBooking
WHERE FK_BookingID IN
(SELECT FK_BookingID
FROM RoomBooking
WHERE FK_RoomID IN
(SELECT FK_RoomID
FROM RoomBooking
WHERE FK_BookingID IN
(SELECT FK_BookingID
FROM RoomBooking
WHERE FK_BookingID NOT IN
(SELECT BookingID
FROM Booking
WHERE CheckInDate <= '2017-10-04'
AND CheckOutDate > '2017-10-02')
)
)
)
AND FK_BookingID NOT IN
(SELECT FK_BookingID
FROM RoomBooking
WHERE FK_BookingID NOT IN
(SELECT BookingID
FROM Booking
WHERE CheckInDate <= '2017-10-04'
AND CheckOutDate > '2017-10-02')
)
);
用你正在使用的数据库标记你的问题。 –
请格式化查询以简化阅读。无需滚动时可读性更高。 –