sqlzoo joinII упражнение - базы данных фильмов 4a

107
11

Это вопрос sqlzoo, и я написал следующий код, но я чувствую, что он слишком избыточный

SELECT year, freq 
FROM (SELECT yr AS year,count(title) AS freq
FROM movie, actor, casting
WHERE name= 'John Travolta'
AND movie.id=movieid
AND actor.id=actorid
GROUP BY yr) AS a
WHERE freq=(
SELECT MAX(freq)
FROM (SELECT yr AS year,count(title) AS freq
FROM movie, actor, casting
WHERE name= 'John Travolta'
AND movie.id=movieid
AND actor.id=actorid
GROUP BY yr) AS b
)

почему это не может быть так?

SELECT year, freq 
FROM (SELECT yr AS year,count(title) AS freq
FROM movie, actor, casting
WHERE name= 'John Travolta'
AND movie.id=movieid
AND actor.id=actorid
GROUP BY yr) AS a
WHERE freq=(
SELECT MAX(freq)
FROM a
)

спросил(а) 2012-04-08T20:35:00+04:00 8 лет, 6 месяцев назад
1
Решение
114

Всякий раз, когда вы пишете подзапросы, внутренние сначала оцениваются, а затем внешние запросы. В вашем втором запросе вы используете псевдоним "a", который фактически не существует. По этой причине вы получите ошибку во втором запросе и вы не можете его использовать. Первый запрос является правильным одним синтаксическим.

ответил(а) 2012-04-08T20:47:00+04:00 8 лет, 6 месяцев назад
59

В подобных случаях может быть полезно использовать CTE (Common Table Expression). Это единственный способ повторного использования подзапроса. Посмотрите, как вы можете использовать ROW_NUMBER чтобы найти самую большую частоту. Я также обновил старую школу FROM A, B, C WHERE... в новую школу FROM A INNER JOIN B... (Я не на 100% уверен, что критерии JOIN верны).

WITH a AS
(
SELECT
yr AS year,
COUNT(title) AS freq
FROM
movie
INNER JOIN
casting ON movie.id = casting.movieid
INNER JOIN
actor ON actor.id = casting.actorid
WHERE
name = 'John Travolta'
GROUP BY
yr),
b AS
(
SELECT
year, freq,
ROW_NUMBER() OVER (ORDER BY freq DESC) as RowNum
FROM a
)
SELECT year, freq
FROM b
WHERE RowNum = 1

ответил(а) 2012-04-08T22:26:00+04:00 8 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема