2012-03-23 12 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コードが役立つ場合は、そこにいくつかの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エラーが発生します。

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

これは外部の助けを得ることなく、「複雑な」質問で私の最初の試み、Bでしたこのエラーは私を捨てました。誰かが上記のクエリを変更するのを手伝って、このタイプの問題についていくつかの指摘をすることができたら、それはすばらしいでしょう:)。

答えて

5

aveMovieRatingを選択リストから削除します。エラーは明らかに「1つの結果しか許されていません...」と言っています。 IN演算子は、1列の行のセットで動作します。

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

関連する問題