web-dev-qa-db-ja.com

SQL ServerCTEの問題

この質問は、私の最後の質問を参照しています: SQL Server 08:Union over while

私はその質問で説明されたことを実行するためにCTEを書いています(指定された日数にわたって利用可能な時間枠を見つけます。

私はCTEを書いていますが、日付を増やして制限する方法を完全に理解することはできません。現状では、2011-07-30(@ArrivalDate)からのみデータを取得します。 適切にインクリメントする方法と、どこが間違っているのかを誰かに説明してもらえますか?

更新:利用可能なすべてのタイムスロットを取得するためのより良いクエリを考え出しました

(SELECT TS.UKTNN, TS.TimeSlotID, TS.TimeSlotGroupID 
 FROM FittingCentreTimeSlotGroupTimeSlots TS)
EXCEPT
(Select BFD.UKTNN, BFD.TimeSlotID, BFD.TimeSlotGroupID 
 From BookedFittingDates BFD) 

そして、コメントで要求されたテーブル構造は次のとおりです。

TimeSlotGroup[〜#〜] uktnn [〜#〜] TimeSlotGroupID、TimeSlotGroupDesc

TimeSlotGroupTimeSlots[〜#〜] uktnn [〜#〜] TimeSlotIDTimeSlotGroupID、TimeSlotDesc

BookedDates[〜#〜] uktnn [〜#〜] TimeSlotGroupIDTimeSlotID日付

これが私の既存のCTEが今どのように見えるかです

Use[DEV_UKTN_DATA]
GO 
DECLARE @UKTNN int;
DECLARE @ArrivalDate date;
DECLARE @NumDays int;
DECLARE @LoopDate date;

SET @UKTNN = 7;
SET @ArrivalDate = '2011-07-30';
SET @LoopDate = @ArrivalDate;
SET @NumDays = 2;

WITH GetTimeSlotsOnDays(TimeSlotGroupID, TimeSlotGroupDesc, TimeSlotID, TimeSlotDescription, AdditionalCost, UKTNN, CurrentDate, Distance)
AS
(
    SELECT TSG.TimeSlotGroupID, 
           TSG.TimeSlotGroupDesc, 
           TS.TimeSlotID, 
           TS.TimeSlotDescription, 
           TS.AdditionalCost,
           @UKTNN AS UKTNN,
           @ArrivalDate as CurrentDate,
           0 As Distance
    FROM FittingCentreBranchTimeSlotGroups TSG
    INNER JOIN FittingCentreTimeSlotGroupTimeSlots TS 
               ON TSG.TimeSlotGroupID = TS.TimeSlotGroupID AND 
                  TSG.UKTNN = TS.UKTNN
    WHERE TSG.UKTNN = @UKTNN AND
          TS.UKTNN = @UKTNN AND
          TS.TimeSlotGroupID = TSG.TimeSlotGroupID AND
          NOT EXISTS(
                SELECT * 
                FROM BookedFittingDates BFD 
                WHERE BFD.TimeSlotGroupID = TS.TimeSlotGroupID AND 
                      BFD.TimeSlotID = TS.TimeSlotID AND
                      BFD.UKTNN = @UKTNN AND
                      BFD.Date = @ArrivalDate)
          --@ArrivalDate <= DATEADD(DAY, @NumDays, @ArrivalDate) 

    UNION ALL --Recursion starts here

    SELECT TSG.TimeSlotGroupID, 
           TSG.TimeSlotGroupDesc, 
           TS.TimeSlotID, 
           TS.TimeSlotDescription, 
           TS.AdditionalCost,
           @UKTNN UKTNN,
           @ArrivalDate As CurrentDate,
           Distance + 1 As Distance
    FROM FittingCentreBranchTimeSlotGroups TSG
    INNER JOIN FittingCentreTimeSlotGroupTimeSlots TS 
               ON TSG.TimeSlotGroupID = TS.TimeSlotGroupID AND 
                  TSG.UKTNN = TS.UKTNN
    INNER JOIN GetTimeSlotsOnDays as GTSOD
               ON GTSOD.CurrentDate = DATEADD(DAY, Distance, @ArrivalDate)
)


SELECT *
FROM GetTimeSlotsOnDays GTSOD
WHERE GTSOD.CurrentDate = @ArrivalDate AND GTSOD.Distance = 0
ORDER BY GTSOD.TimeSlotGroupID ASC, GTSOD.TimeSlotID ASC
GO
5
Andy Hunt

私はこれに対する答えを見つけました!

1)目的の日付を含むテーブルを返す関数を作成します

2)日付を使用してタイムスロットのデカルト積を実行します

3)予約日とデカルト積の間の例外を見つけます

2
Andy Hunt