我有两个表,其中一个是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
我的错误在哪里?
答案 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
当我开始回答时,其他答案尚未发布