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。这不是完整的代码,它会检查许多其他条件,但这是导致问题的唯一条件,我无法显示完整的代码。
答案 0 :(得分:2)
使用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
答案 1 :(得分:1)
要显示所有教师,无论他们是否有日程安排,您都必须使用LEFT JOIN。 LEFT JOIN显示左表(在您的案例中为教师)的所有数据,即使它在右表(在您的案例表中)中没有值。
在您的代码中,这看起来像这样:
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()