Обновление базы данных sqlite с использованием соединений и внутренних выборок - PullRequest
2 голосов
/ 23 марта 2012

Работали над этим вопросом пару часов и подошли близко, но все еще не смогли получить желаемых результатов.Вот вопрос ниже:

Для всех фильмов, которые имеют средний рейтинг 4 звезды или выше, добавьте 25 к году выпуска.(Обновите существующие строки; не вставляйте новые строки.).

Таблицы, необходимые для этого запроса, находятся в другом вопросе, который я уже разместил здесь, на Как получить результатыэтот конкретный «запрос» .Названия таблиц: «фильм» и «рейтинг».Там вы также можете увидеть некоторый 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, являющегося частью выражения * 1020, допускается только один результат

Это была моя первая попытка «сложного» вопроса без посторонней помощи, но эта ошибка отбросила меня.Если кто-то сможет помочь мне изменить приведенный выше запрос и дать несколько советов об этом типе проблемы, это было бы здорово:).

1 Ответ

5 голосов
/ 23 марта 2012

Удалить aveMovieRating из списка выбора.Ошибка говорит об этом ясно: «допускается только ОДИНОЧНЫЙ РЕЗУЛЬТАТ».Оператор IN работает с набором строк из одного столбца.

ОБНОВЛЕНИЕ:

Что касается обновления, его можно немного сжать, удалив ненужные столбцы:

UPDATE movie
SET year = (year + 25)
WHERE movie.mid IN (
        SELECT rating.mid
        FROM rating 
        GROUP BY mid
        HAVING avg(Stars) >= 4
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...