首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到解决方案或解决方法

找不到解决方案或解决方法
EN

Stack Overflow用户
提问于 2016-10-14 17:30:32
回答 2查看 75关注 0票数 1

SQL Server 2008及更高版本。

假设我有一个名为“教师”的数据库表,它包含学校中教师的详细信息,另一个名为“时间表”的表包含他们的时间表。有时,如果我需要在特定的一天随机地自动分配几个小时给一个或多个老师,比如当一个老师缺课时,另一个老师可以利用这段时间。

如下所示:

代码语言:javascript
复制
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。这不是完整的代码,它检查了许多其他条件,但这是导致问题的唯一条件,我无法显示完整的代码。

EN

回答 2

Stack Overflow用户

发布于 2016-10-14 17:44:19

使用LEFT JOIN这将带来所有教师记录

代码语言:javascript
复制
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()

更新:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-10-14 17:42:47

要显示所有教师,无论他们是否有时间表,都必须使用左连接。左连接显示左表(在您的案例中是教师)的所有数据,即使它在右表中没有值(在您的案例计划中)。

在您的代码中,如下所示:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40039716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档