SQL Server GROUP BY ошибка - PullRequest
       12

SQL Server GROUP BY ошибка

0 голосов
/ 14 июля 2009

Вот запрос, который я пытаюсь выполнить:

  SELECT TOP 5 PageComment.ID
    FROM PageComment
   WHERE PageComment.ParentID IN (SELECT ID FROM ProjectPage)
GROUP BY PageComment.ParentID

В результате я хочу получить один комментарий на проект, однако этот запрос выдает эту ошибку:

"[Microsoft] [собственный клиент SQL] [SQL Server] Столбец PageComment.ID недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY"

Я понимаю, что он говорит, но этот запрос будет работать в MySQL, как бы я достиг этого в SQL Server?

Ответы [ 6 ]

2 голосов
/ 14 июля 2009

Да, MySQL позволит вам сделать это и вернет то, о чем вы просили. Проблема в том, что то, что вы просите, не является конкретным, поэтому результат также не конкретен. Он будет возвращать одно из значений PageComment.ID из каждой группы, но не имеет значения, какое из них.

В SQL Server вам нужно быть более конкретным и точно указывать, какое значение PageComment.ID требуется для каждой группы. Например, тот, который имеет наименьшее значение:

select top 5 min(c.ID)
from PageComment c
inner join ProjectPage p on p.ID = c.ParentID
group by c.ParentID

(Обратите внимание, что я изменил in (select ...) на inner join.)

Вы также можете добавить order by, чтобы указать, из каких пяти проектов вы хотите получать данные.

2 голосов
/ 14 июля 2009

Для чего именно вы GROUPING BY? В вашем запросе нет функции AGGREGATE (например, SUM, COUNT, MAX, MIN и т. Д.), Поэтому нет необходимости в GROUP BY. Вы хотите заказать случайно?

0 голосов
/ 14 июля 2009

Запустите следующий запрос и просмотрите результаты ...

SELECT TOP 5 PageComment.ID, PageComment.ParentID
FROM PageComment
WHERE PageComment.ParentID IN (SELECT ID FROM ProjectPage)
GROUP BY PageComment.ParentID

Затем подумайте о том, как группировка будет работать с этими данными. Мы не можем помочь вам с группировкой, потому что мы не знаем, что вы пытаетесь сделать.

0 голосов
/ 14 июля 2009

Я не думаю, что запрос находится на правильном пути вообще. В дополнение к выбранным значениям, которые не являются атрибутами групп, вы действительно пытаетесь получить TOP 1 для каждого родителя и используете TOP 5, потому что есть 5 родителей

Я думаю, это то, что вы ищете:

WITH FirstComment AS (
    SELECT ParentID, MIN(ID) AS ID
    FROM PageComment
    GROUP BY ParentID
)
SELECT ProjectPage.ID, FirstComment.ID
FROM ProjectPage
LEFT JOIN FirstComment
    ON FirstComment.ParentID = ProjectPage.ID
0 голосов
/ 14 июля 2009

Если вы знаете, что у каждого родительского идентификатора есть только один идентификатор, который вы можете сделать:

SELECT TOP 5 
         MAX(PageComment.ID )
    from PageComment 
   WHERE PageComment.ParentID IN (SELECT ID FROM ProjectPage) 
GROUP BY PageComment.ParentID
0 голосов
/ 14 июля 2009

Вы должны поместить все столбцы, которые вы выбираете, в предложение GROUP BY.

Например:

SELECT TOP 5 PageComment.ID
FROM PageComment
WHERE PageComment.ParentID IN (SELECT ID FROM ProjectPage)
GROUP BY PageComment.ID
...