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