【问题标题】:Why does the code 'ORDER BY rating DESC' cause an error in my code?为什么代码“ORDER BY rating DESC”会导致我的代码出错?
【发布时间】:2020-11-25 15:43:35
【问题描述】:

在 cs50 课程中,我被分配列出 2012 年的所有电影及其评分,在 sql 中按评分降序排列。当我编写此代码时出现错误

'line 12: 2111 超出文件大小限制/usr/bin/sqlite3 -header -分隔符'| ' "$@"'

我想知道为什么。

SELECT title, rating FROM movies, ratings
WHERE year = 2012 AND movie_id IN (SELECT id FROM movies
WHERE year = 2012)
ORDER BY rating DESC

删除“ORDER BY rating DESC”后,该错误确实消失了,但我不能这样做,因为 check50 不会接受它。

【问题讨论】:

  • 从不FROM 子句中使用逗号。 始终使用正确、明确、标准、可读的JOIN语法。
  • 谢谢!它现在似乎可以工作了。
  • 不要在标题中添加“已修复”。只需接受一个答案。

标签: sql sqlite cs50


【解决方案1】:

这是一个意外的交叉连接,或Cartesian Product,这将导致结果集很大:每个(电影、评分)组合占一行,而不是每个评分占一行,标题从相关电影。

大的结果大小显然会在排序时导致资源耗尽错误。当您没有 ORDER BY 时,不必对结果进行缓冲和排序,因此它需要的资源更少。

应该是这样的

SELECT m.title, r.rating 
FROM movies m
JOIN ratings r
  ON m.id = r.movie_id
WHERE r.year = 2012 
AND m.year = 2012
ORDER BY r.rating DESC

【讨论】:

    【解决方案2】:

    你应该重写你的查询如下:

    SELECT title, rating FROM movies INNER JOIN ratings
    ON movies.movie_id = ratings.movie_id
    WHERE movies.year = 2012
    ORDER BY rating DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2018-10-19
      • 2011-07-07
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多