2012-03-23 52 views
2

已經在這個問題上工作了幾個小時,已經接近但仍然無法獲得我想要的結果。這裏是以下問題:使用連接和內部選擇更新sqlite數據庫

For all movies that have an average rating of 4 stars or higher, add 25 to the release year. (Update the existing Rows; don't insert new Rows.) .

此查詢所需的表是我已經張貼在這裏,在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) 

執行上面的查詢生成以下SQL錯誤的SQLite:

Error: only a single result allowed for a SELECT that is part of an expression

這是我在「複雜」的問題,第一次嘗試沒有得到外界的幫助,b這個錯誤把我拋下了。如果有人能夠幫助我改變上述查詢,並給出關於這類問題的一些指示,那就太棒了:)。

回答

5

刪除aveMovieRating從選擇列表中。這個錯誤很清楚地表明:「只有一個結果允許......」。 IN運算符處理一組單列行。

UPDATE:

至於更新,您可以通過刪除不必要的列壓縮了一點:

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

輝煌答案:)。這真的把我的代碼截斷了一些,我忘了「HAVING」函數... – Rob 2012-03-23 04:05:53