2010-05-05 16 views
9

Esto siempre me ha molestado: ¿por qué la cláusula GROUP BY en una declaración SQL requiere que incluya todas las columnas no agregadas? Estas columnas deben incluirse por defecto, una especie de "GROUP BY *", ya que ni siquiera puedo ejecutar la consulta a menos que estén todas incluidas. Cada columna tiene que ser un agregado o estar especificada en "GROUP BY", pero parece que cualquier cosa no agregada debe agruparse automáticamente.¿Por qué debo especificar explícitamente todas las columnas en una cláusula SQL "GROUP BY"? ¿Por qué no "GROUP BY *"?

Tal vez es parte del estándar ANSI-SQL, pero aún así, no entiendo por qué. ¿Puede alguien ayudarme a entender la necesidad de esta convención?

+0

Relacionados http://stackoverflow.com/questions/416625/why-does-sql-force-me-to-repeat-all-non-aggregated-fields-from-my-select-clause-i –

+0

Ah - es un duplicado Cerraré esta pregunta. – SqlRyan

+1

Its a multicate: http://stackoverflow.com/questions/2311034/is-sql-group-by-a-design-flaw – cindi

Respuesta

19

Es difícil saber exactamente qué pensaban los diseñadores del lenguaje SQL cuando escribieron el estándar, pero esta es mi opinión.

SQL, como regla general, requiere que indique explícitamente sus expectativas y su intención. El lenguaje no intenta "adivina lo que querías decir", y completa automáticamente los espacios en blanco. Esto es bueno.

Al escribir una consulta, la consideración más importante es que arroja los resultados correctos. Si cometió un error, probablemente sea mejor que el analizador SQL lo informe, en lugar de adivinar su intención y devolver resultados que pueden no ser correctos. La naturaleza declarativa de SQL (donde usted declara lo que desea recuperar en lugar de los pasos de cómo recuperarlo) ya facilita la inadvertencia de cometer errores. Introducir fuzziniess en la sintaxis del lenguaje no lo haría mejor.

De hecho, cada caso que puedo pensar en donde el lenguaje permite accesos directos ha causado problemas. Tome, por ejemplo, uniones naturales, donde puede omitir los nombres de las columnas a las que desea unirse y permitir que la base de datos las infiera en función de los nombres de las columnas. Una vez que los nombres de las columnas cambian (como lo hacen naturalmente en el tiempo) - la semántica de las consultas existentes cambia con ellos. Esto es malo ... muy malo - realmente no desea que este tipo de magia ocurra entre bastidores en su código de base de datos.

Una consecuencia de esta elección de diseño, sin embargo, es que SQL es un lenguaje detallado en el que debe expresar explícitamente su intención. Esto puede dar como resultado tener que escribir más código del que le gustaría, y quejarse de por qué ciertos constructos son tan detallados ... pero al final del día, es lo que es.

0

Es simple así: solicitaste agrupar los resultados por cada columna en la cláusula from, lo que significa que para cada columna en la cláusula SQL, el motor sql agrupará internamente los conjuntos de resultados antes de presentarlo a tú. Entonces eso explica por qué le pide que mencione todas las columnas presentes en el from from porque no es posible agruparlo parcialmente. Si mencionó la cláusula group by, solo es posible lograr su intención agrupando también todas las columnas. Es una restricción matemática.

0

La única razón lógica que puedo pensar para mantener la cláusula GROUP BY es que puede incluir campos que NO están incluidos en su columna de selección en su agrupación.

Por ejemplo.

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

A pesar de que las columnas 3 no está representada en la consulta en otro lugar, puede todavía los resultados del grupo por su valor. (Por supuesto, una vez que haya hecho eso, no puede deducir por qué los registros se agruparon como estaban).

Parece un atajo simple para la mayoría de las situaciones comunes (agrupamiento por cada uno de los columnas agregadas) sería una herramienta simple pero efectiva para acelerar la codificación.

Quizás "GROUP BY *"

Puesto que ya es bastante común en las herramientas de SQL para permitir que las referencias a las columnas por el número de columna de resultados (es decir. GROUP BY 1,2,3, etc.) Parecería más simple todavía ser capaz de permitir que el usuario de forma automática incluir todos los campos no agregados con una sola pulsación de tecla.