Eu sou novo no servidor SQL e estava tentando usar um alias em uma cláusula where e então percebi que a ordem de processamento tornava difícil fazer isso, então usei isto:
SELECT DISTINCT * FROM (SELECT LEFT(fiscal,4) AS fiscalyear FROM
Transactions ) fiscalyears
WHERE fiscalyear >= '2009'
Eu poderia ter usado isso também, pois funciona também:
SELECT DISTINCT LEFT(fiscal, 4) FROM Transactions
WHERE LEFT(fiscal, 4) >= '2009'
Agora, a pergunta que tenho sobre isso é: um método é melhor que o outro? O plano de execução da consulta parece idêntico para ambos (não sei como ler um plano de consulta em profundidade, apenas vi que é semelhante em ambos os casos). Esta é apenas uma pequena tabela com um pequeno número de linhas, mas haverá diferenças perceptíveis com grandes quantidades de dados?
O SQL Server geralmente é bastante inteligente em não computar a mesma coisa várias vezes no mesmo nível de escopo. Portanto, você deve ver apenas um escalar de computação em qualquer variação.
Na verdade, mesmo nesse caso mais complexo, o SQL Server ainda consegue exigir apenas um único escalar de computação e todo o custo é o mesmo:
(E nem é preciso dizer que a melhor abordagem - se
fiscalyear
for data/hora - é ter uma cláusula sargable where, comoWHERE fiscalyear >= '20090101'
. Se for uma string, como @ypercube mencionou acima, você não precisa da expressão esquerda -WHERE fiscalyear >= '2009'
faz a mesma coisa.)Mas, como resposta genérica, se você tiver alguma dúvida sobre isso, execute as duas consultas com o plano de execução real ativado e veja se são diferentes. No entanto, direi que o formulário de subconsulta geralmente é usado não para impedir que uma expressão seja avaliada várias vezes, mas para evitar ter que digitá-la várias vezes. E mesmo que você não tenha digitado várias vezes, ainda há casos em que ainda pode ser avaliado várias vezes. Portanto, não existe um "este método é melhor que o outro" absoluto.