我有两张表,一张是联赛,另一张是匹配,在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
我的错误在哪里?
发布于 2017-07-01 14:52:24
将正确的表筛选器移动到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
发布于 2017-07-01 14:55:37
断开左侧联接的位置。
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
当我开始回答这个问题时,另一个答案还没有发布。
https://stackoverflow.com/questions/44862219
复制相似问题