查询售票总数最高的影院:SQL缺失影院6的问题排查及修正
问题排查与解决:售票最高影院查询缺失记录
问题背景
- 需求:找出售票总数最高的影院,售票分为official和retail两部分,无对应记录则视为0
- 涉及两张表:
- Official表(字段:Cinema、Date、OfficialSold)
- Retail表(字段:Cinema、Date、RetailSold)
- 异常情况:期望输出包含售票总数为30的影院4、5、6,但当前查询仅返回4、5,缺失影院6
错误原因
你用LEFT JOIN以Official表为基准关联Retail表,这会直接过滤掉只在Retail表有记录、完全没出现在Official表的影院(比如影院6)——这类影院根本不会进入CombinedTickets临时表,自然不会出现在最终结果里。
正确实现代码
先获取所有存在的影院ID(覆盖两个表的所有影院),再分别关联两个表统计售票总数,确保没有遗漏:
WITH AllCinemas AS ( -- 提取所有存在的影院ID,自动去重 SELECT Cinema FROM Official UNION SELECT Cinema FROM Retail ), CombinedTickets AS ( SELECT ac.Cinema, COALESCE(SUM(o.OfficialSold), 0) AS OfficialSold, COALESCE(SUM(r.RetailSold), 0) AS RetailSold, COALESCE(SUM(o.OfficialSold), 0) + COALESCE(SUM(r.RetailSold), 0) AS TotalTickets FROM AllCinemas ac LEFT JOIN Official o ON ac.Cinema = o.Cinema LEFT JOIN Retail r ON ac.Cinema = r.Cinema GROUP BY ac.Cinema ), MaxTickets AS ( SELECT MAX(TotalTickets) AS MaxTotal FROM CombinedTickets ) SELECT Cinema, OfficialSold, RetailSold, TotalTickets FROM CombinedTickets CROSS JOIN MaxTickets WHERE TotalTickets = MaxTotal ORDER BY Cinema;
关键说明
UNION用来合并两个表的影院ID并去重,确保所有影院都被纳入统计- 用
SUM是因为同一个影院可能有多条日期的售票记录,需要累加总数;如果需求是单日统计,去掉SUM并按Cinema, Date分组即可 - 两次
LEFT JOIN保证不管影院在哪个表有记录,都能被统计到,无记录的部分自动用0填充
内容的提问来源于stack exchange,提问作者heihei Li
相关产品推荐
相关产品推荐

