sql递归调用

sql递归调用,sql,sql-server-2008,Sql,Sql Server 2008,我有这样一个场景,即课程取消,我需要列出连续(同一讲师30分钟内的课程)和相邻课程(不同讲师,30分钟内的同一辆车)的列表 我得到了部分列表构建,但是,如果有邻接会话,我只需要检查它是否有邻接会话,而不检查另一个邻接会话 下面是示例数据。我得到3张唱片作为回报。记录1被取消。因此我查找连续会话,但没有。然后查找相邻会话,即记录2。对于记录2,查找连续会话,没有。相邻会话不应出现 sessionKey LKey instructorKey sessionStart s

我有这样一个场景,即课程取消,我需要列出连续(同一讲师30分钟内的课程)和相邻课程(不同讲师,30分钟内的同一辆车)的列表

我得到了部分列表构建,但是,如果有邻接会话,我只需要检查它是否有邻接会话,而不检查另一个邻接会话

下面是示例数据。我得到3张唱片作为回报。记录1被取消。因此我查找连续会话,但没有。然后查找相邻会话,即记录2。对于记录2,查找连续会话,没有。相邻会话不应出现

sessionKey  LKey  instructorKey sessionStart              sessionEnd                carKey    FirstKey
1            13   36754         2015-07-01 10:30:00.000   2015-07-01 12:30:00.000   139       1
2            34   12383         2015-07-01 08:15:00.000   2015-07-01 10:15:00.000   139       1
3            34   8             2015-07-01 06:00:00.000   2015-07-01 08:00:00.000   139       1
代码如下所示:

DECLARE @CancelTime   datetime
SET @CancelTime = '2015-07-01 10:30:00'


            DECLARE @DataFromYourTables TABLE (
                sessionKey      int         NOT NULL,
                locationKey     smallint,
                sessionStart    datetime    NOT NULL,
                sessionEnd      datetime    NOT NULL,
                instructorKey   int         NOT NULL,
                Flag            int,
                carKey          smallint    NOT NULL,
                cnt             int,
                bookingLock     int,
                hubLock         int  
            )

            INSERT INTO @DataFromYourTables

            SELECT  s.sessionKey,
                    s.locationKey,
                    su.sessionStart,
                    su.sessionEnd,
                    su.instructorKey,
                    su.btwSeatsOverride AS Flag,
                    s.carKey,
                    (SELECT count(sm.sessionKey) from sessionMap SM
                        where SM.sessionKey = s.sessionKey
                    )cnt,
                    isNUll(S.bookingLock,0) as bookingLock,
                    isNUll(S.hubLock,0) as hubLock
            FROM    session s
            JOIN    sessionunit su ON su.sessionKey = s.sessionKey
            JOIN    product     p  ON p.productKey = s.productKey AND p.productTypeKey IN (2,4)
            WHERE   CONVERT(date, su.sessionStart) = CONVERT(date, @CancelTime)
            AND    (su.instructorKey = 1 OR s.carKey = 1)


            DECLARE @Results TABLE (
                sessionKey      int,
                locationKey     smallint,
                instructorKey   int,
                sessionStart    datetime,
                sessionEnd      datetime,
                carKey          smallint,
                Flag            int,
                FirstKey        int,
                cnt             int,
                bookingLOck     int,
                hubLock         int 
           )

           ;WITH myCTE AS
                (
                SELECT  sessionKey,
                        locationKey,
                        instructorKey,
                        sessionStart,
                        sessionEnd,
                        carKey,
                        Flag,
                        sessionKey AS FirstKey,
                        cnt,
                        bookingLock,
                        hubLock
                FROM    @DataFromYourTables
                WHERE   sessionStart = @CancelTime


                UNION ALL
                SELECT  a.sessionKey,
                        a.locationKey,
                        a.instructorKey,
                        a.sessionStart,
                        a.sessionEnd,
                        a.carKey,
                        a.Flag,
                        FirstKey,
                        a.cnt,
                        a.bookingLock,
                        a.hubLock
                FROM    @DataFromYourTables a
                JOIN    myCTE b
                ON      b.sessionEnd BETWEEN DATEADD(n, -29, a.SessionStart) AND DATEADD(n, 29, a.SessionStart) and b.instructorKey = a.instructorKey 
                )
                INSERT INTO @Results
                SELECT * FROM myCTE



                ;WITH myCTE AS
                (
                SELECT  sessionKey,
                        locationKey,
                        instructorKey,
                        sessionStart,
                        sessionEnd,
                        carKey,
                        Flag,
                        sessionKey AS FirstKey,
                        cnt,
                        bookingLock,
                        hubLock
                FROM     @DataFromYourTables
                WHERE   sessionStart = @CancelTime
                UNION ALL
                SELECT  a.sessionKey,
                        a.locationKey,
                        a.instructorKey,
                        a.sessionStart,
                        a.sessionEnd,
                        a.carKey,
                        a.Flag,
                        FirstKey,
                        a.cnt,
                        a.bookingLock,
                        a.hubLock
                FROM    @DataFromYourTables a
                JOIN    myCTE b
                ON      b.sessionStart BETWEEN DATEADD(n, -29, a.SessionEnd) AND DATEADD(n, 29, a.SessionEnd) 
                and b.instructorKey <> a.instructorKey 
                and b.carKey = a.carKey

                )

                INSERT INTO @Results
                SELECT * FROM myCTE
               WHERE  sessionKey <> FirstKey




                SELECT  *,
                        CASE
                            WHEN sessionKey <> FirstKey THEN 0
                            ELSE 1
                        END Comment
                FROM    @Results
                ORDER BY sessionStart

很难确定你需要什么。您能否从样本数据中提供所需结果,并确保样本数据说明了实际表格中可能出现的每种情况。所需结果为SessionKey LKey InstructorySessionStart sessionEnd carKey FirstKey 1 13 36754 2015-07-01 10:30:00.0002015-07-01 12:30:00.000 139 1 2 34 12383 2015-07-01 08:15:00.000 2015-07-01 10:15:00.000 139 1
SessionKey  LKey  instructorKey  sessionStart             sessionEnd               carKey  FirstKey
1           13    36754          2015-07-01 10:30:00.000  2015-07-01 12:30:00.000  139     1 
2           34    12383          2015-07-01 08:15:00.000  2015-07-01 10:15:00.000  139     1