2015-02-08 3 views
0

Мой запрос - получить верхний балл каждого игрока и Время, прошедшее для этого сеанса.SQL ORDER BY Подзапрос

В MySQL используется следующий запрос и работает

SELECT Playername as 'Player Name', HighScores.P1Score as 'Highest Score', TimeElapsed as 'Elapsed Time' 
FROM 
(gamerecord inner join playerprofile ON playerprofile.PID = gamerecord.PID), 
(SELECT GID, PID, P1Score 
FROM (SELECT GID, PID, P1Score 
     FROM gamerecord 
     ORDER BY 3 DESC) AS sortedtable 
GROUP BY PID) AS HighScores 
WHERE gamerecord.GID = Highscores.GID 

Теперь при работе с MSSQL Server, выбрасывается следующее сообщение об ошибке.

Предложение ORDER BY недействительна в представлениях, встроенных функциях, производных таблиц, подзапросов и общих табличных выражений, если оно не указано TOP, OFFSET или FOR XML.

Самый внутренний запрос используется для сортировки результата перед операцией GROUP BY. Отмечается, что GROUP BY занимает наибольшее значение и, таким образом, сортируя, я уверен, что верхнее значение является наивысшим показателем.

Как я могу сделать эту работу с MSSQL без этой ошибки?

+0

В строке 7 вы не должны использовать 'ORDER BY 3 DESC'. Вместо '3' вы должны использовать допустимое имя столбца. ** EDIT: ** По-видимому, это допустимый синтаксис (даже я не вижу смысла в нем). Ошибка должна быть где-то в другом месте. –

+0

В MySQL это недокументированное решение (если вы не подсчитаете раздел комментариев на соответствующей странице руководства). Не можете ли вы использовать документальное решение. – Strawberry

+0

@ Майкл Вагнер 'ORDER BY 3 DESC' - это не то, что он ожидает, но это все еще действительный синтаксис. Вы можете просто заказать выражение, а не только имя столбца. Это не причина ошибки. –

ответ

1

Я ожидал бы запрос, который находит максимальное количество баллов для каждой игры, используя group, а затем присоединение в остальной части информации:

SELECT pp.Playername , gr.P1Score as HighestScore, gr.TimeElapsed 
FROM gamerecord gr inner join 
    playerprofile pp 
    ON pp.PID = gr.PID inner join 
    (SELECT PID, max(p1score) as maxscore 
     FROM gamerecord 
     GROUP BY PID 
    ) grmax 
    ON gr.PID = grmax.PID and gr.p1score = grmax.maxscore; 

order by не подходит для этого типа запроса.

+0

Я не вижу, как это работает и не работает. GID - уникальный идентификатор для каждой игры. Это первичный ключ для таблицы gamerecord. Таким образом, 'max (P1Score)' ничего не делает в этом контексте. – DarkDestry

+0

Я изменил некоторые из используемых имен, и он работает. Благодарю. – DarkDestry

Смежные вопросы