ссылка на временную связь из квалификационного списка - PullRequest
3 голосов
/ 19 января 2012

Рассмотрим SQL-запрос, подобный этому

SELECT Temp.rating, Temp.avgage
FROM (SELECT S.rating, AVG (S.age) AS avgage
FROM Sailors S 
GROUP BY S.rating) AS Temp
WHERE Temp.avgage = (SELECT MIN (Temp.avgage)
FROM Temp)

Монитор MySQL выдает эту ошибку:

ОШИБКА 1146 (42S02): таблица 'testDB.Temp' не существует

Что я должен сделать, чтобы избежать этой ошибки?

1 Ответ

1 голос
/ 19 января 2012
SELECT Temp.rating, Temp.avgage 
FROM 
  ( SELECT S.rating, AVG(S.age) AS avgage
    FROM Sailors S 
    GROUP BY S.rating
  ) AS Temp
WHERE Temp.avgage = 
      ( SELECT MIN (Temp.avgage)
        FROM Temp                --- the error is here
      )

В зависимости от того, как вы хотите обрабатывать галстуки, вы можете просто использовать:

SELECT Temp.rating, Temp.avgage 
FROM 
  ( SELECT S.rating, AVG(S.age) AS avgage
    FROM Sailors S 
    GROUP BY S.rating
  ) AS Temp
ORDER BY Temp.avgage 
LIMIT 1

или более простой эквивалент:

SELECT S.rating, AVG(S.age) AS avgage
FROM Sailors S 
GROUP BY S.rating
ORDER BY avgage 
LIMIT 1

или этот (который показывает все связанные результаты):

SELECT Temp.rating, Temp.avgage 
FROM 
  ( SELECT S.rating, AVG(S.age) AS avgage
    FROM Sailors S 
    GROUP BY S.rating
  ) AS Temp
WHERE Temp.avgage = 
      ( SELECT AVG(S.age) AS avgage
        FROM Sailors S 
        GROUP BY S.rating
        ORDER BY avgage 
        LIMIT 1              
      )
...