Почему этот запрос работает только тогда, когда я использую группу по? - PullRequest
3 голосов
/ 24 ноября 2010

Этот запрос работает:

select p.Nombre as Nombre, c.Nombre as Categoria, s.Nombre as Subcategoria FROM Producto as p
inner join Subcategoria as s ON p.IDSubcategoria = s.ID
inner join Categoria as c on s.IDCategoria = c.ID
group by p.Nombre, c.Nombre, s.Nombre
order by p.Nombre

Но когда я удаляю s.Nombre в выражении group by, я получаю эту ошибку:

Сообщение 8120, уровень 16, состояние 1, строка 1 Колонка «Подкатегория.Номбре» неверно в списке выбора, потому что это не содержится ни в агрегатная функция или GROUP BY пункт.

Может кто-нибудь немного объяснить мне, что делает группировка по функциям и почему это позволяет запросу работать?

В интересах обучения! Спасибо.

Ответы [ 4 ]

3 голосов
/ 24 ноября 2010

Когда вы устанавливаете группу по p.Nombre, вы указываете, что для каждого отдельного p.Nombre должен быть ровно 1 ряд выходных данных.Следовательно, другие поля в предложении select должны быть агрегированы (чтобы при наличии нескольких строк с одинаковым p.Nombre их можно было «свернуть» в одно значение)

Группируя по p.Nombre, c.Nombre, s.Nombre, выговорят, что должен быть ровно 1 ряд выходных данных для каждого отдельного кортежа.Следовательно, это работает (потому что отображаемые поля участвуют в предложении группировки).

0 голосов
/ 24 ноября 2010

Предложение group-by требуется только в том случае, если вы используете агрегатные функции, такие как COUNT или MAX. В качестве побочного эффекта он удаляет повторяющиеся строки. В вашем случае проще удалить дубликаты, добавив DISTINCT к предложению select и полностью удалив предложение group-by.

select DISTINCT p.Nombre as Nombre, c.Nombre as Categoria, s.Nombre as Subcategoria FROM Producto as p
inner join Subcategoria as s ON p.IDSubcategoria = s.ID
inner join Categoria as c on s.IDCategoria = c.ID
order by p.Nombre
0 голосов
/ 24 ноября 2010

Функция group by сворачивает те строки, которые имеют одинаковое значение в столбцах, указанных в предложении GROUP BY, в одну строку.Для любых других столбцов в вашем SELECT, которые не указаны в предложении GROUP BY, движок SQL должен знать, что делать с этими столбцами также с помощью функции агрегирования, например, SUM, MAX, AVG и т. Д. Если вы неЕсли указать функцию агрегирования, то механизм выдаст исключение, потому что не знает, что делать.

Например,

select p.Nombre as Nombre, c.Nombre as Categoria, SUM(s.Nombre) as Subcategoria FROM Producto as p 
inner join Subcategoria as s ON p.IDSubcategoria = s.ID 
inner join Categoria as c on s.IDCategoria = c.ID 
group by p.Nombre, c.Nombre
order by p.Nombre 
0 голосов
/ 24 ноября 2010

Если вы используете предложение GROUP BY, вы можете иметь в полях SELECT:

  • поля, которые вы уже используете в группе, по разделам
  • объединяет (мин, макс, кол ....) в других полях

Один небольшой пример:

 MyTable
 FieldA  FieldB
    a      1
    a      2
    b      3
    b      5

Запрос:

select a, b from myTable GroupBy a

A   B
a   ?
b   ?

Какие значения вы хотите иметь в поле B?

a-> 1 или a -> 2 или a -> 3 (1 + 2)

Если в первую очередь вам нужна min (a) агрегатная функция.Если вам нужно 2 - макс.Если 3 - сумма ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...