2

テーブルの構造、クエリ、結果をご覧ください。

会議室

   ID | Area | RoomNo    Capacity   distances 
   --- ----- --------- ---------- ----------
   1   1     R1         10        10        
   2   1     R3         24        4         
   3   8     R4         24        4         
   4   1     R5         10        10     

予約テーブル

ReservationID RoomID      DateTimeStart           DateTimeEnd             
------------- ----------- ----------------------- ----------------------- 
1             1           2013-10-10 17:00:00.000 2013-10-10 19:00:00.000 

クエリ

 Declare @Start Datetime
 Declare @End Datetime

 set @Start='2013-10-10 13:00:00.000'
 set @End='2013-10-10 14:00:00.000'

 select 
     MeetingRoom.ID 
 from 
    MeetingRoom 
    left Join ResReservationTable Res on Res.RoomID = MeetingRoom.ID
 Where 
   Res.DateTimeStart != @Start and Res.DateTimeEnd != @End
   and (Res.DateTimeStart Not Between @Start and @End) 
   and (Res.DateTimeEnd Not Between @Start and @End)

このクエリは、4つのレコードを返す必要があるため、1つのレコードのみを返します。

4

4 に答える 4

4

結果ではなく右側のテーブルLEFT OUTER JOIN に設定された条件で使用する場合は、があります。WHERE clauseIS NULLINNER JOIN

これがあなたの望むものだと思います。

Declare @Start Datetime
Declare @End Datetime

set @Start='2013-10-10 13:00:00.000'
set @End='2013-10-10 14:00:00.000'

select 
     MeetingRoom.ID 
from 
    MeetingRoom 
    left Join ResReservationTable Res on Res.RoomID = MeetingRoom.ID
Where
  (
   Res.DateTimeStart != @Start and Res.DateTimeEnd != @End
   and (Res.DateTimeStart Not Between @Start and @End) 
   and (Res.DateTimeEnd Not Between @Start and @End)
  )
  OR Res.ReservationID IS NULL

私はあなたがあなたのWHERE状態を言い換えなければならないと思います。完全に空いている(つまり、間隔が交差しない)部屋が必要な場合は、次を使用できます。

WHERE
   Res.DateTimeStart > @End
   OR Res.DateTimeEnd < @Start
   OR Res.ReservationID IS NULL 
于 2013-01-27T11:44:13.427 に答える
2

内部結合を使用する必要があります... 編集実行中に 外部結合を使用する必要がありますが、null値が非null値とどのように比較されるかを考慮してください...

1つの方法は、OR句を使用してnullの日付値を明示的に受け入れることです。

于 2013-01-27T11:39:57.437 に答える
2

最善のアプローチは、WHERE句からON句にデータを移動することです。

select 
    MeetingRoom.ID 
from MeetingRoom 
left Join ResReservationTable Res on Res.RoomID = MeetingRoom.ID
and Res.DateTimeStart != @Start and Res.DateTimeEnd != @End
and Res.DateTimeStart Not Between @Start and @End
and Res.DateTimeEnd Not Between @Start and @End

そして、ちょっとプレスト、あなたは外部結合を維持しますが、それでも結果をフィルタリングします、そしてあなたは今クエリの最高のパフォーマンスのバージョンを持っています。

結合条件には「キー関連」式しかないというのは非常に一般的で誤った仮定ですが、実際には、結合されるテーブルに関係しない列の条件であっても、任意の条件を持つことができます。

于 2013-01-27T11:53:27.087 に答える
2

これを試してみませんか?「Outer」を使用して、予約のない部屋に返されるNULL値をチェックし、それらの行も返します。

Declare @Start Datetime
 Declare @End Datetime

 set @Start='2013-10-10 13:00:00.000'
 set @End='2013-10-10 14:00:00.000'

 select 
     MeetingRoom.ID 
 from 
    MeetingRoom 
    left Outer Join ResReservationTable Res on Res.RoomID = MeetingRoom.ID
 Where 
   (Res.DateTimeStart is NULL OR Res.DateTimeEnd is NULL)
   and Res.DateTimeStart != @Start and Res.DateTimeEnd != @End
   and (Res.DateTimeStart Not Between @Start and @End) 
   and (Res.DateTimeEnd Not Between @Start and @End)
于 2013-01-27T11:59:52.343 に答える