发布
社区首页 >问答首页 >Server空表连接

Server空表连接
EN

Stack Overflow用户
提问于 2017-07-01 14:46:48
回答 2查看 69关注 0票数 1

我有两张表,一张是联赛,另一张是匹配,在MATCH表中有一个列作为refLeague,现在我想得到一周的总比赛

例如

代码语言:javascript
代码运行次数:0
复制
Id TotalMatches
-- ------------
1   12
2    0
3    6

如果没有匹配,我希望将0写入表。

代码语言:javascript
代码运行次数:0
复制
 SELECT l.Id ,COUNT(m.Id) as TotalMatches 
 FROM LEAGUE l
 LEFT JOIN MATCH m ON l.Id = m.refLeauge
 WHERE 
     m.MatchDate >= DATEADD(dd, DATEDIFF(dd, 1, GETDATE()) / 7 * 7 + 1, 0) 
     AND m.MatchDate < DATEADD(dd, DATEDIFF(dd, -6, GETDATE())/7 * 7 + 1, 0) 
     AND l.refSport = 1
 GROUP BY l.Id

我编写了这个查询,但由于Match表中没有行,所以它没有给出任何结果,但必须写入0。

示例

代码语言:javascript
代码运行次数:0
复制
Id TotalMatches
-- ------------
 1      0
 2      0
 3      0

我的错误在哪里?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-01 14:52:24

将正确的表筛选器移动到ON条件

非匹配记录将在NULL中包含m.MatchDate值,该值将由Where子句中的条件进行过滤。隐式地将其转换为INNER JOIN。因此,条件应该移到ON子句中,它告诉要与LEAGUE连接的记录是什么,而不是过滤结果。

代码语言:javascript
代码运行次数:0
复制
SELECT l.id, 
       Count(m.id) AS TotalMatches 
FROM   league l 
       LEFT JOIN match m 
              ON l.id = m.refleauge 
                 AND m.matchdate >= Dateadd(dd, Datediff(dd, 1, Getdate()) / 7 * 7 + 1, 0) 
                 AND m.matchdate < Dateadd(dd, Datediff(dd, -6, Getdate()) / 7 * 7 + 1, 0) 
WHERE  l.refsport = 1 
GROUP  BY l.id 
票数 3
EN

Stack Overflow用户

发布于 2017-07-01 14:55:37

断开左侧联接的位置。

代码语言:javascript
代码运行次数:0
复制
 SELECT l.Id, COUNT(m.Id) as TotalMatches 
 FROM LEAGUE l
 LEFT JOIN MATCH m 
   ON l.Id = m.refLeauge
  and m.MatchDate >= dateadd(dd, datediff(dd, 1, getdate()) / 7 * 7 + 1,0) 
  AND m.MatchDate <  dateadd(dd, datediff(dd,-6, getdate()) / 7 * 7 + 1,0) 
 where l.refSport=1
 GROUP BY l.Id

/7*7=1

当我开始回答这个问题时,另一个答案还没有发布。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44862219

复制
相关文章

相似问题

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