Solo curiosidad por la sintaxis SQL. Entonces si tengo
SELECT
itemName as ItemName,
substring(itemName, 1,1) as FirstLetter,
Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter
Esto sería incorrecto porque
GROUP BY itemName, FirstLetter
realmente debería ser
GROUP BY itemName, substring(itemName, 1,1)
Pero, ¿por qué no podemos simplemente usar el primero por conveniencia?
Respuestas:
SQL se implementa como si se ejecutara una consulta en el siguiente orden:
Para la mayoría de los sistemas de bases de datos relacionales, este orden explica qué nombres (columnas o alias) son válidos porque deben haberse introducido en un paso anterior.
Por lo tanto, en Oracle y SQL Server, no puede usar un término en la cláusula GROUP BY que defina en la cláusula SELECT porque GROUP BY se ejecuta antes que la cláusula SELECT.
Sin embargo, hay excepciones: MySQL y Postgres parecen tener una inteligencia adicional que lo permite.
fuente
GROUP BY substring(itemName, 1,1)
, ¿es la base de datos lo suficientemente inteligente como para no tomar el golpe de rendimiento de volver a calcular la subcadena en la cláusula SELECT?sql_mode
sin incluir ONLY_FULL_GROUP_BY en la máscara de bits, el Optimizador tiene la oportunidad de ofrecer mejores resultados con un uso variado / diferente del alias en laHAVING
cláusula.Siempre puede usar una subconsulta para poder usar el alias; Por supuesto, verifique el rendimiento (es posible que el servidor db se ejecute de la misma manera, pero nunca está de más verificarlo):
fuente
Al menos en PostgreSQL puede usar el número de columna en el conjunto de resultados en su cláusula GROUP BY:
Por supuesto, esto comienza a ser complicado si lo hace de forma interactiva y edita la consulta para cambiar el número o el orden de las columnas en el resultado. Pero aún.
fuente
GROUP BY FirstLetter
está permitido en Postgresql. A saber, intente ejecutar esto en Postgresql: seleccione substring (table_name, 1,2) como tname del grupo information_schema.tables por tnameGROUP BY
cualquier expresión que contenga funciones agregadas o funciones de ventana, que "obviamente" no funciona.SQL Server no le permite hacer referencia al alias en la cláusula GROUP BY debido al orden lógico de procesamiento. La cláusula GROUP BY se procesa antes que la cláusula SELECT, por lo que el alias no se conoce cuando se evalúa la cláusula GROUP BY. Esto también explica por qué puede usar el alias en la cláusula ORDER BY.
Aquí hay una fuente de información sobre las fases de procesamiento lógico de SQL Server .
fuente
No estoy respondiendo por qué es así, pero solo quería mostrar una forma de evitar esa limitación en SQL Server utilizando
CROSS APPLY
para crear el alias. Luego lo usa en laGROUP BY
cláusula, así:fuente
Tenga en cuenta que el uso de alias en Group By (para servicios que lo admiten, como postgres) puede tener resultados no deseados. Por ejemplo, si crea un alias que ya existe en la declaración interna, Group By elegirá el nombre del campo interno.
fuente
Algunos DBMS le permitirán usar un alias en lugar de tener que repetir toda la expresión.
Teradata es uno de esos ejemplos.
Evito la notación de posición ordinal según lo recomendado por Bill por razones documentadas en esta pregunta SO .
La alternativa fácil y robusta es repetir siempre la expresión en la cláusula GROUP BY.
DRY NO se aplica a SQL.
fuente
Tenga cuidado con el uso de alias al agrupar los resultados de una vista en SQLite. Obtendrá resultados inesperados si el nombre del alias es el mismo que el nombre de la columna de las tablas subyacentes (para las vistas).
fuente
En el pasado descubrí que Rdb, el antiguo producto DEC ahora compatible con Oracle, permitía usar el alias de columna en GROUP BY. Oracle convencional a través de la versión 11 no permite que el alias de columna se use en GROUP BY. No estoy seguro de qué permitirá o no permitirá Postgresql, SQL Server, MySQL, etc. YMMV.
fuente