SQL 服务器左侧连接未从左侧返回预期记录 table

SQL server left join not returning expected records from left table

我在 SQl Server 2008 R2 数据库中有两个对象,我试图用左连接将它们连接在一起,但我无法从 return 获得所有记录的左连接table.

vw_academicweeks是一个视图,包含每个学年的周数、一周的第一天和最后一天,每个学年包含 52 条记录。

tt_activityoccurrence 是一个 table 包含一年内出现的课程,一年中的所有 52 周都不会上课。

通过我的查询,我试图return vw_academicweeks 视图中的所有实例到return 以下信息

+------------+------------+------------+------------+---------+
| ActivityID | WeekStart  | StartTime  |  EndTime   | week_no |
+------------+------------+------------+------------+---------+
|      59936 | 04/09/2017 | 05/09/2017 | 05/09/2017 |       6 |
|      59936 | 11/09/2017 | 12/09/2017 | 12/09/2017 |       7 |
|      59936 | 18/09/2017 | 19/09/2017 | 19/09/2017 |       8 |
|      59936 | 25/09/2017 | 26/09/2017 | 26/09/2017 |       9 |
|      59936 | 02/10/2017 | 03/10/2017 | 03/10/2017 |      10 |
|      59936 | 09/10/2017 | 10/10/2017 | 10/10/2017 |      11 |
|      59936 | 16/10/2017 | 17/10/2017 | 17/10/2017 |      12 |
|      59936 | Null       | Null       | Null       |      13 |
|      59936 | 30/10/2017 | 31/10/2017 | 31/10/2017 |      14 |
|      59936 | 06/11/2017 | 07/11/2017 | 07/11/2017 |      15 |
|      59936 | 13/11/2017 | 14/11/2017 | 14/11/2017 |      16 |
|      59936 | 20/11/2017 | 21/11/2017 | 21/11/2017 |      17 |
|      59936 | 27/11/2017 | 28/11/2017 | 28/11/2017 |      18 |
|      59936 | 04/12/2017 | 05/12/2017 | 05/12/2017 |      19 |
|      59936 | 11/12/2017 | 12/12/2017 | 12/12/2017 |      20 |
|      59936 | 18/12/2017 | 19/12/2017 | 19/12/2017 |      21 |
|      59936 | Null       | Null       | Null       |      22 |
|      59936 | Null       | Null       | Null       |      23 |
+------------+------------+------------+------------+---------+

使用左连接,我可以 return 除空值之外的所有值,因此 week_no 列缺少行 13,22 和 23。我也尝试过使用外连接但收到相同的信息。

我觉得我遗漏了一些明显的东西,但它现在正在逃避我。

select 
    ttao.ActivityID
    ,dateadd(dd,datediff(dd,0,DATEADD(dd, -(DATEPART(dw, ttao.StartTime)-1), ttao.StartTime)),0) WeekStart
    ,ttao.StartTime
    ,ttao.EndTime
    ,aw.week_no

from

vw_AcademicWeeks AW
left join TT_ActivityOccurrence TTAO on
(dateadd(dd,datediff(dd,0,DATEADD(dd, -(DATEPART(dw, ttao.StartTime)-1), ttao.StartTime)),0))=aw.ay_start
where 

ay_code='1718' and
TTAO.ActivityID='59936'

order by aw.week_no asc

您的 where 子句通过消除 outside of the scope of your 行连接使其成为 inner join。您需要将此逻辑移至您的连接语句。请注意,我没有验证您的加入条件(dateadd...datediff 逻辑)

select 
    ttao.ActivityID
    ,dateadd(dd,datediff(dd,0,DATEADD(dd, -(DATEPART(dw, ttao.StartTime)-1), ttao.StartTime)),0) WeekStart
    ,ttao.StartTime
    ,ttao.EndTime
    ,aw.week_no    
from    
vw_AcademicWeeks AW
left join TT_ActivityOccurrence TTAO on
    (dateadd(dd,datediff(dd,0,DATEADD(dd, -(DATEPART(dw, ttao.StartTime)-1), ttao.StartTime)),0)) = aw.ay_start
    and ay_code='1718' 
    and TTAO.ActivityID='59936'    
order by aw.week_no asc