Em teoria, cada instrução no SQL Server cria uma tabela virtual passada para a próxima instrução. Em outras palavras, quando as cláusulas FROM e Where são finalizadas, a próxima etapa é SELECt colunas do grupo virtual criado na etapa anterior.
Mas, é possível ordenar o conjunto de resultados por coluna que não está listada na lista de seleção.
Como é possível, quando a cláusula SELECT é executada antes de ORDER BY e qual tarefa principal é selecionar colunas para renderização?
É um pouco confuso ou eu não entendo nada.
Nem sempre é possível:
(VT5 é tabela virtual retornada gerada por
SELECT
)A explicação foi retirada de "Inside SQLServer 2008 T-SQL Querying" - não tenho certeza se este capítulo específico está disponível online (Etapa 6: A
ORDER BY
fase de apresentação, p.16.)Desta forma,
dá um erro:
O que acontece neste cenário é que a coluna classificada agora fará parte da
Output
operação de varredura/busca. Por exemplo, tome este exemplo:Agora pegue esta consulta (sem classificação, apenas recuperando os dados de duas colunas):
Teremos um plano de execução que, para a varredura de índice clusterizado, possui uma lista de saída de
some_int
esome_bigint
. Assim como você esperaria. Agora vamos alterar esta consulta e classificar em uma coluna, mas não a inclua nos dados da coluna selecionada:Agora temos uma lista de saída na varredura de índice clusterizado que inclui
id
,some_int
esome_bigint
.