0
SELECT ID, Name
FROM dbo.AmenitiesList 
WHERE TypeID=@Type and Status = 'Available'
    AND ID NOT IN
    (SELECT AmenitiesID FROM dbo.ReservationList
     WHERE Status = 'Cancelled' AND StartDate between @Arrival and @Departure
     or EndDate between @Arrival and @Departure
     or @Arrival between StartDate and EndDate
     or @Departure between StartDate and EndDate)

これは私の質問です。ステータスが「キャンセル済み」であり、データベースの到着日と出発日の間に到着日と出発日がないすべての利用可能なアメニティを表示したいと思います。しかし、データを取得するときに、ステータスがキャンセルされると、日付の間にあるものに関する他の条件がトリガーされるため、アメニティを利用できませんでした。それを回避する方法は?

キャンセルされ、到着日と出発日の間にないアメニティを表示したい

よろしくお願いします!

4

3 に答える 3

1

パフォーマンスと最適化のために、テーブル変数を検討してください。

DECLARE @TABLE AS TABLE
(
  AmenityID INT PRIMARY KEY CLUSTERED
)
INSERT INTO @TABLE
SELECT AmenitiesID FROM dbo.ReservationList
--Your conditions

--Get values that exist
SELECT * FROM AmentitiesList al
INNER JOIN @Table t on al.AmenityID = t.AmenityID

--Get values that don't
SELECT * FROM AmentitiesList al
LEFT JOIN @Table t on al.AmenityID = t.AmenityID
WHERE t.AmenityID IS NULL

コードが短いからといって、スケーリングできるとは限りません。Left Joinsも痛い…

テーブル変数を使用することで、これも簡単に取り除くことができます。

DECLARE @AmenityList AS TABLE
(
  AmenityID INT PRIMARY KEY CLUSTERED
  Matched BIT DEFAULT(0)
)
INSERT INTO @AmenityList
Select AmenityID FROM AmentitiesList

UPDATE @AmenityList SET Matched = 1
FROM @AmenitityList al
INNER JOIN @Table t on t.AmentityID = al.AmentityID

SELECT * FROM @AmentityList WHERE Matched = 0
于 2013-03-04T16:35:30.593 に答える
1

このバージョンはどうですか?

SELECT ID, Name
FROM dbo.AmenitiesList 
WHERE TypeID=@Type and Status = 'Available'
    AND ID NOT IN
    (SELECT AmenitiesID FROM dbo.ReservationList
     WHERE Status = 'Cancelled' AND (StartDate between @Arrival and @Departure
     or EndDate between @Arrival and @Departure
     or @Arrival between StartDate and EndDate
     or @Departure between StartDate and EndDate))
于 2013-03-04T16:35:53.070 に答える
0
SELECT ID, Name
FROM dbo.AmenitiesList 
WHERE TypeID=@Type and Status = 'Available'
    AND ID NOT IN
    (SELECT AmenitiesID FROM dbo.ReservationList
 WHERE Status != 'Cancelled' AND Status != 'Check Out' AND  ((@Arrival <= EndDate) AND (@Departure >= StartDate)))

これは私の問題を解決します!ところで、私に情報を提供するために時間を割いてくれてありがとう!神のご加護を!

于 2013-03-04T17:10:43.797 に答える