使用连接和内部选择更新sqlite数据库

时间:2012-03-23 03:33:31

标签: sql sqlite

已经在这个问题上工作了几个小时并且已经接近但仍然无法得到我想要的结果。以下是以下问题:

  

对于平均评分为4星或更高的所有电影,请添加   25到发行年份。 (更新现有行;不要插入新行   行。)。

此查询所需的表格是我已在How to get results of this particular "query"处发布的另一个问题。表名是“电影”和“评级”。如果有帮助的话,你可以在那里看到一些sql代码。

我解决这个问题的第一步是(显然)寻找平均评级为4星或更高的电影。我用以下查询做到了:

SELECT movie.mid, aveMovieRating 
FROM movie JOIN(
    SELECT DISTINCT(rating.mid), 
    COUNT(mid) AS "Number of movies", 
    SUM(stars) AS "Total no# of stars", 
    (SUM(stars)*1.0/COUNT(mid)) AS aveMovieRating
    FROM rating 
    GROUP BY mid
) AS aveRating
ON movie.mid = aveRating.mid
WHERE aveMovieRating >= 4

然后我来到了棘手的部分 - 根据问题要求试图改变发布年份...这是我想出来的查询:

UPDATE movie
SET year = (year + 25)
WHERE movie.mid IN(
SELECT movie.mid, aveMovieRating 
FROM movie JOIN(
    SELECT DISTINCT(rating.mid), 
    COUNT(mid) AS "Number of movies", 
    SUM(stars) AS "Total no# of stars", 
    (SUM(stars)*1.0/COUNT(mid)) AS aveMovieRating
    FROM rating 
    GROUP BY mid
) AS aveRating
ON movie.mid = aveRating.mid
WHERE aveMovieRating >= 4)

执行上述查询会在SQLite中生成以下SQL错误:

  

错误:只有一个结果允许SELECT作为表达式的一部分

这是我第一次尝试“复杂”的问题而没有得到外界的帮助,但是这个错误让我失望了。如果有人能够帮助我改变上面的查询,并给出一些关于这类问题的指示,那就太棒了:)。

1 个答案:

答案 0 :(得分:5)

从选择列表中删除 aveMovieRating 。该错误清楚地表明:“只允许单一结果......”。 IN运算符处理一组单列行。

<强>更新

至于更新,您可以通过删除不必要的列来压缩它:

UPDATE movie
SET year = (year + 25)
WHERE movie.mid IN (
        SELECT rating.mid
        FROM rating 
        GROUP BY mid
        HAVING avg(Stars) >= 4
)