SQL Server空表连接

时间:2017-07-01 14:46:49

标签: sql sql-server tsql left-join

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

例如

Id TotalMatches
-- ------------
1   12
2    0
3    6

如果没有匹配,我想写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

实施例

Id TotalMatches
-- ------------
 1      0
 2      0
 3      0

我的错误在哪里?

2 个答案:

答案 0 :(得分:3)

将右表过滤器移至ON条件

非匹配记录在NULL中将包含m.MatchDate个值,这些值将根据Where子句中的条件进行过滤。隐含地它将被转换为INNER JOIN。因此,应将条件移至ON子句,该子句说明要与LEAGUE连接的记录,而不是过滤结果

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 

答案 1 :(得分:2)

在哪里打破左连接

 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

当我开始回答时,其他答案尚未发布