SQL Server 2008及更高版本。
假设我有一个名为“教师”的数据库表,它包含学校中教师的详细信息,另一个名为“时间表”的表包含他们的时间表。有时,如果我需要在特定的一天随机地自动分配几个小时给一个或多个老师,比如当一个老师缺课时,另一个老师可以利用这段时间。
如下所示:
Declare @hrs numeric(24, 6) = 3
SELECT T_Code
FROM Teachers
LEFT JOIN Schedules S
WHERE (SELECT 8 - ISNULL(SUM(S_HOURS),0) AS AVLHRS
FROM Schedules
WHERE S_Teacher = S.S_Teacher) < @hrs
ORDER BY ISNULL(S_HOURS,0), NEWID()但这里的问题是,只有那些被安排的教师是计算出来的,所以我没有得到所有可用的教师的列表。例如,假设我有一位新老师,他甚至没有被安排,也想按该老师留下的小时数的降序进行排序。这将不会显示该教师,但我也希望该教师能够被看到。我找不到周围的工作。
PS。这不是完整的代码,它检查了许多其他条件,但这是导致问题的唯一条件,我无法显示完整的代码。
发布于 2016-10-14 17:44:19
使用LEFT JOIN这将带来所有教师记录
SELECT T_Code
FROM Teachers
LEFT JOIN Schedules S ON Teachers.ID = S.TeacherID
AND (SELECT 8 - ISNULL(SUM(S_HOURS),0) AS AVLHRS
FROM Schedules
WHERE S_Teacher = S.S_Teacher) < @hrs
ORDER BY ISNULL(S_HOURS,0), NEWID()更新:
SELECT T_Code,
ISNULL(TmpTable.AVLHRS,0) AVLHRS
FROM Teachers
LEFT JOIN Schedules S ON Teachers.ID = S.TeacherID
OUTER APPLY(
SELECT 8 - ISNULL(SUM(S_HOURS),0) AS AVLHRS
FROM Schedules
WHERE S_Teacher = S.S_Teacher
)TmpTable
WHERE TmpTable.AVLHRS < @hrs
ORDER BY AVLHRS发布于 2016-10-14 17:42:47
要显示所有教师,无论他们是否有时间表,都必须使用左连接。左连接显示左表(在您的案例中是教师)的所有数据,即使它在右表中没有值(在您的案例计划中)。
在您的代码中,如下所示:
SELECT T_Code from Teachers LEFT JOIN Schedules S
WHERE (SELECT 8 - ISNULL(SUM(S_HOURS),0) AS AVLHRS
FROM Schedules WHERE S_Teacher = S.S_Teacher) < @hrs
ORDER BY ISNULL(S_HOURS,0), NEWID()https://stackoverflow.com/questions/40039716
复制相似问题