Sql server 2008 r2 SQL server左联接未从左表返回预期记录

Sql server 2008 r2 SQL server左联接未从左表返回预期记录,sql-server-2008-r2,left-join,Sql Server 2008 R2,Left Join,我在SQLServer2008R2数据库中有两个对象,我正试图使用左连接将其连接在一起,但无法使用左连接返回表中的所有记录 1表-tt_活动发生率 1视图-大众汽车(vw_) vw_academicweeks是一个视图,包含每个学年的周数、每周的第一天和最后一天,并包含每个学年的52条记录 tt_ActivityOccess是一个包含一年内课程发生次数的表格,课程不会在一年的所有52周内发生 通过我的查询,我试图从vw_视图返回所有实例,以返回以下信息 +------------+-----

我在SQLServer2008R2数据库中有两个对象,我正试图使用左连接将其连接在一起,但无法使用左连接返回表中的所有记录

  • 1表-tt_活动发生率
  • 1视图-大众汽车(vw_)
vw_academicweeks是一个视图,包含每个学年的周数、每周的第一天和最后一天,并包含每个学年的52条记录

tt_ActivityOccess是一个包含一年内课程发生次数的表格,课程不会在一年的所有52周内发生

通过我的查询,我试图从vw_视图返回所有实例,以返回以下信息

+------------+------------+------------+------------+---------+
| 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 |
+------------+------------+------------+------------+---------+
通过左连接,我可以返回除空值以外的所有值,因此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子句通过消除行连接使其成为
内部连接。您需要将此逻辑上移到join语句中。注意,我没有验证您的加入条件(dateadd…datediff逻辑)


可能是Hi的副本。这是一个常见问题,你所要做的就是用谷歌搜索你的标题。请总是用谷歌搜索你的问题/问题/目标的许多清晰、简洁和具体的版本/措辞,有或没有你的特定字符串/名称,并阅读许多答案。将发现的相关关键字添加到搜索中。如果找不到答案,请使用一种变体搜索标签的标题和关键字,然后发布。了解左连接返回的内容:行上的内部连接加上由null扩展的不匹配左表行。一个where,它要求右表列在上的左连接后不为null,即删除由null扩展的任何行,即只保留行上的内部连接,即“将外部连接转换为内部连接”。始终知道作为左连接的一部分,您需要什么样的内部连接。不要气馁。虽然这很常见,但在学习连接时通常不会涉及到这一点,而且很容易被忽略,即使对于已经编写了几个月TSQL的人来说也是如此。谢谢你,我尝试过几次,但我的语法肯定有错误,根本不用担心@a.Steer
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