SQL报错:Missing FROM Clause Entry,求修复年度最高评分影片查询
修复「Missing FROM Clause Entry」错误并实现每年最高评分影片查询
嘿,我来帮你搞定这个SQL的问题!你的报错主要有几个关键原因,咱们一步步来修复:
问题排查
- 缺少主查询语句:你定义了三个CTE(
p_names、m、t),但最后没有编写主查询来调用这些CTE并返回结果,这是触发「Missing FROM Clause Entry」的核心原因。 - 保留关键字冲突:
primary是SQL的保留关键字,直接用它作为列名会导致语法解析错误,必须转义处理。 - 未关联关键CTE:存储年度最高评分的
m表和整合了影片信息的t表没有关联,没法筛选出对应年份的最高评分影片。
修复后的SQL代码
WITH p_names AS ( -- 转义保留关键字primary,不同数据库转义方式不同:PostgreSQL用双引号,MySQL用反引号,SQL Server用方括号 SELECT movie_id, name AS p_name FROM movie_names WHERE "primary" = true ), m AS ( SELECT year_released AS yr, MAX(rating) AS rating_max FROM p_names NATURAL JOIN movies NATURAL JOIN ratings GROUP BY year_released ), t AS ( SELECT p_name, year_released, rating, votes FROM p_names NATURAL JOIN movies NATURAL JOIN ratings ) -- 主查询:关联t和m,筛选出每年评分等于当年最高分的影片 SELECT t.p_name, t.year_released, t.rating, t.votes FROM t JOIN m ON t.year_released = m.yr AND t.rating = m.rating_max ORDER BY t.year_released DESC;
关键修改说明
- 对保留关键字
primary进行转义:你可以根据自己使用的数据库调整转义方式,比如MySQL用`primary`,SQL Server用[primary]。 - 添加了主查询:通过JOIN关联
t和m,筛选出每个年份中评分等于当年最高分的影片,最后按年份倒序排列方便查看。 - 保留了原有的CTE结构,同时补充了缺失的关联逻辑,确保能正确返回每年评分最高的影片数据。
内容的提问来源于stack exchange,提问作者MMMMMCK
相关产品推荐
相关产品推荐

