SQL lite написать запрос
У меня есть БД people со столбцами id, name,birth БД movies со столбцами id,title,year; БД stars (актеры) со столбцами movie_id,person_id Задача найти средний возраст актеров, когда они начали сниматься в фильмах. Вроде данный запрос дает нужное число, но он не оптимален, не понимаю как уйти от вложенных запросов.
SELECT ROUND(AVG(delta),2) FROM
(SELECT MIN(movies.year)-people.birth as delta
from people, stars, movies
WHERE (people.id = stars.person_id)
AND (stars.movie_id=movies.id)
GROUP BY people.name)
Ответы (1 шт):
Вполне хороший запрос. В подзапросах нет ничего плохого.
Враг производительности - это CROSS JOIN(перечисление таблиц через запятую в секции FROM), в твоём случае нужно использовать INNER JOIN:
SELECT ROUND(AVG(delta), 2)
FROM
(
SELECT MIN(m.year) - p.birth AS delta
FROM people AS p
INNER JOIN stars AS s ON p.id = s.person_id
INNER JOIN movies AS m ON s.movie_id = m.id
GROUP BY p.name
)
Хоть и оптимизатор может "догадаться", что тут не нужен CROSS и в плане сделает INNER, всё же лучше использовать операторы по назначению.
Если этот вариант не улучшит производительность, то стоит посмотреть в сторону индексов и статистики. Так же не будет лишним приложить план запроса.