2017-10-14 115 views
0

我在SQL Server中建立了一个酒店预订数据库。表中的三个是如下:SQL太复杂的嵌套查询 - 你能简化一下吗?

E-model

相关列的表中有:

  • BookingBookingID(PK),CheckInDateCheckoutDate
  • RoomBookingRoomBookingID(PK), FK_Booking_ID(FK),FK_RoomID(FK)
  • RoomRoomID(PK)

现在我写了一个SQL查询(如下所示),试图找出在某个日期(2017-10-02到2017-10-04)哪些房间是免费的。代码解决了这个问题,但变得非常复杂。我知道如何通过在表RoomBooking中使CheckInDateCheckOutDate更容易地解决这个问题,但我希望此设置能够正常工作。你有什么想法如何简化下面的代码?

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') 
            ) 
          ); 
+2

用你正在使用的数据库标记你的问题。 –

+0

请格式化查询以简化阅读。无需滚动时可读性更高。 –

回答

3

我希望查询是这样的:

select r.* 
from room r 
where not exists (select 1 
        from roombooking rb join 
         booking b 
         on b.bookingid = r.bookingid 
        where r.roomid = rb.roomid and 
         '2017-10-02' < b.CheckOutDate and 
         '2017-10-04' >= b.CheckInDate 
       ); 

这是假定房间可供检查在有人检查了一天。

我不明白你为什么在fk_前加上一些列。外键关系应该明显来自具有相同名称的键(以及被明确声明)。许多数据库支持ANSI标准USING子句,并且具有不同的密钥名称会阻止您使用它。

+0

很快回答非常感谢!我对SQL很陌生,所以我不知道USING子句。谢谢你告诉我这个! – mike