2009-07-13 1 views
0

Вот запрос я пытаюсь запустить:SQL Server GROUP BY ошибка

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

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

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

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

+2

Вы уверены, что работает в MySQL? –

+0

Этот запрос «будет» работать? звучит так, как будто вы не тестировали его и выполняете предположение. – Nippysaurus

+0

Я уверен, что он будет выполняться в MySQL, но это не значит, что запрос или результат имеет смысл ... – Guffa

ответ

2

Да, 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 также, чтобы указать, какие пять проектов, которые вы хотите данные ,

+0

Отлично, спасибо за это объяснение. –

0

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

Например:

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

Что именно вы группирование по для? У вас нет функции AGGREGATE в запросе (например, SUM, COUNT, MAX, MIN и т. Д.), Поэтому GROUP BY не требуется. Вы хотите ЗАКАЗАТЬ КАК?

+0

Точно. Я не мог понять, зачем нужна группа. +1 – shahkalpesh

+0

Я ожидаю, что это забавный способ написать «SELECT DISTINCT» ... –

0

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

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

Я не думаю, что запрос на правильном пути вообще. В дополнение к значениям, которые вы выбираете, которые не являются атрибутами групп, действительно ли вы пытаетесь получить для каждого родителя, и вы используете 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

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

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

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