Apenas curioso sobre a sintaxe SQL. Então, se eu tiver
SELECT
itemName as ItemName,
substring(itemName, 1,1) as FirstLetter,
Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter
Isso estaria incorreto porque
GROUP BY itemName, FirstLetter
realmente deveria ser
GROUP BY itemName, substring(itemName, 1,1)
Mas por que não podemos simplesmente usar o primeiro por conveniência?
Respostas:
SQL é implementado como se uma consulta fosse executada na seguinte ordem:
Para a maioria dos sistemas de bancos de dados relacionais, essa ordem explica quais nomes (colunas ou aliases) são válidos porque devem ter sido introduzidos em uma etapa anterior.
Portanto, no Oracle e no SQL Server, você não pode usar um termo na cláusula GROUP BY que você define na cláusula SELECT porque o GROUP BY é executado antes da cláusula SELECT.
Porém, existem exceções: MySQL e Postgres parecem ter inteligência adicional que permite isso.
fonte
GROUP BY substring(itemName, 1,1)
, o banco de dados é inteligente o suficiente para não sofrer o desempenho de recalcular a substring na cláusula SELECT?sql_mode
não incluindo ONLY_FULL_GROUP_BY na máscara de bit , o Optimizer tem a chance de oferecer melhores resultados com um uso variado / diferente do alias naHAVING
cláusula.Você sempre pode usar uma subconsulta para poder usar o alias; Obviamente, verifique o desempenho (é possível que o servidor db funcione da mesma forma, mas nunca é demais verificar):
fonte
Pelo menos no PostgreSQL, você pode usar o número da coluna no conjunto de resultados na sua cláusula GROUP BY:
É claro que isso começa a ser problemático se você estiver fazendo isso de maneira interativa e editar a consulta para alterar o número ou a ordem das colunas no resultado. Mas ainda.
fonte
GROUP BY FirstLetter
é permitido no Postgresql. A saber, tente executar este no PostgreSQL: select substring (table_name, 1,2) como tname do grupo information_schema.tables por tnameGROUP BY
qualquer expressão que contenha funções agregadas ou funções da janela, o que "obviamente" não funciona.O SQL Server não permite que você faça referência ao alias na cláusula GROUP BY devido à ordem lógica do processamento. A cláusula GROUP BY é processada antes da cláusula SELECT, portanto, o alias não é conhecido quando a cláusula GROUP BY é avaliada. Isso também explica por que você pode usar o alias na cláusula ORDER BY.
Aqui está uma fonte de informações sobre as fases do processamento lógico do SQL Server .
fonte
Não estou respondendo por que é assim, mas só queria mostrar uma maneira de contornar essa limitação no SQL Server usando
CROSS APPLY
para criar o alias. Você o usa naGROUP BY
cláusula, assim:fonte
Cuidado para que o uso do alias no Group By (para serviços que o suportem, como o postgres) possa ter resultados indesejados. Por exemplo, se você criar um alias que já existe na instrução interna, o Agrupar por escolherá o nome do campo interno.
fonte
Alguns DBMSs permitem que você use um alias em vez de precisar repetir a expressão inteira.
Teradata é um exemplo.
Evito a notação da posição ordinal, conforme recomendado por Bill, pelos motivos documentados nesta pergunta do SO .
A alternativa fácil e robusta é sempre repetir a expressão na cláusula GROUP BY.
DRY NÃO se aplica ao SQL.
fonte
Cuidado ao usar aliases ao agrupar os resultados de uma exibição no SQLite. Você obterá resultados inesperados se o nome alternativo for o mesmo que o nome da coluna de qualquer tabela subjacente (para as visualizações).
fonte
Naquele dia, descobri que o Rdb, o antigo produto DEC agora suportado pela Oracle, permitia que o alias da coluna fosse usado no GROUP BY. O mainstream Oracle através da versão 11 não permite que o alias da coluna seja usado no GROUP BY. Não tenho certeza do que o Postgresql, SQL Server, MySQL, etc permitirá ou não. YMMV.
fonte