Sql server 2008 r2 SQL server左联接未从左表返回预期记录
我在SQLServer2008R2数据库中有两个对象,我正试图使用左连接将其连接在一起,但无法使用左连接返回表中的所有记录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_视图返回所有实例,以返回以下信息 +------------+-----
- 1表-tt_活动发生率
- 1视图-大众汽车(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