Почему мне нужно явно указать все столбцы в SQL «Group by» Prose - почему бы не «группу *»?

StackOverflow https://stackoverflow.com/questions/2777235

Вопрос

Это всегда надоело мне - почему в группе по пункту в операторе SQL требуется, чтобы я включал все не совокупные столбцы? Эти столбцы должны быть включены по умолчанию - своего рода «группу *» - поскольку я даже не могу запустить запрос, если они все не включены. Каждый столбец должен быть либо совокупным, либо быть указан в «группе», но кажется, что все, что не агрегируется, не должны быть автоматически сгруппированы.

Может быть, это часть стандарта ANSI-SQL, но даже так, я не понимаю, почему. Может кто-нибудь помочь мне понять необходимость в этой конвенции?

Это было полезно?

Решение

Трудно точно знать, что дизайнеры языка SQL думают, когда они написали стандарт, Но вот мое мнение.

SQL, как правило, как правило, требует, чтобы вы четко укажите ваши ожидания и ваше намерение. Язык не пытается «Угадай, что вы имели в виду», и автоматически заполнить пробелы. Это хорошая вещь.

Когда вы пишете запрос, самое важное соображение в том, что это дает правильные результаты. Если вы допустили ошибку, это, вероятно, лучше, чтобы SQL Parser сообщает вам, а не догадаться о ваших намерениях и возвратных результатах, которые могут быть не правильными. Декларативный характер SQL (где вы указываете то, что вы хотите получить, а не шаги, как его получить) уже облегчает случайно сделать ошибки. Представляя неццаниц в языковой синтаксис не сделает это лучше.

На самом деле, каждый случай, когда я могу думать, где язык позволяет ярлыки вызвал проблемы. Возьмите, например, Natural Joins - где вы можете опустить имена столбцов, которые вы хотите присоединиться, и разрешите базу данных вывести их на основе имени столбцов. Как только имена столбцов меняются (как они естественно делают со временем) - семантика существующих запросов меняется с ними. Это плохо ... очень плохо - Вы действительно не хотите такого рода магия происходит за кулисами в вашем коде база данных.

Однако одним из следствий этого выбора дизайна заключается в том, что SQL является многообразным языком, в котором вы должны явно выразить свое намерение. Это может привести к тому, чтобы написать больше кода, чем вам понравится, и погребаешься о том, почему определенные конструкции так многословны ... Но в конце дня - это то, что оно есть.

Другие советы

Проще всего так: вы попросили SQL Group результаты по всему столбцу в пункте «Из из», означающего для каждого столбца в разделе SQL SQL, двигатель SQL предоставит внутренне группу наборов результатов, прежде чем представить его вам. Так что объясняет, почему он просит вас упомянуть все столбцы, присутствующие в том, что он тоже из-за того, что его невозможна группа частично. Если вы упомянули группу по поводу пункта, что только для SQL добиться вашего намерения, также группируя все столбцы. Это рестрикция математики.

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

Например.

Select column1, SUM(column2) AS sum
 FROM table1
 GROUP BY column1, column3

Несмотря на то, что столбец3 не представлен в другом месте в запросе, вы все еще можете группировать результаты по его значению. (Конечно, когда вы сделали это, вы не можете сказать из результата, почему записи были сгруппированы, как они были.)

Это похоже на простой ярлык для подавляюще наиболее распространенного сценария (группировка каждым из совокупных столбцов) будет простой, но эффективный инструмент для ускорения кодирования.

Возможно "GROUP BY *"

Поскольку в инструментах SQL уже довольно распространено, чтобы разрешить ссылки на столбцы по номеру столбца результата (т. Е. GROUP BY 1,2,3, И т. Д.) Казалось бы, чтобы пользователю все еще могло бы позволить пользователю автоматически включать все не совокупные поля в один клавиш.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top