SQL no tiene ningún orden de ejecución. Es un lenguaje declarativo El optimizador es libre de elegir cualquier orden que se considere apropiada para producir el mejor tiempo de ejecución. Dada una consulta SQL, es básicamente imposible que alguien pretenda conocer el orden de ejecución. Si agrega información detallada sobre el esquema involucrado (tablas exactas y definición de índices) y las cardinalidades estimadas (tamaño de los datos y selectividad de las claves), entonces puede tomar una conjetura en el probable orden de ejecución.
En última instancia, la única 'orden' correcta es la que se describe en el plan de ejecución real. Ver Displaying Execution Plans by Using SQL Server Profiler Event Classes y Displaying Graphical Execution Plans (SQL Server Management Studio).
Sin embargo, una cosa completamente diferente es cómo las consultas, subconsultas y expresiones se proyectan en 'validez'. Por ejemplo, si tiene una expresión con alias en la lista de proyección SELECT, ¿puede usar el alias en la cláusula WHERE? De esta manera:
SELECT a+b as c
FROM t
WHERE c=...;
es el uso de c
alias válido en la cláusula where? La respuesta es no. Las consultas forman un árbol de sintaxis, y una rama inferior del árbol no puede ser referencia de algo definido más arriba en el árbol. Esto no es necesariamente un orden de 'ejecución', es más un problema de análisis de sintaxis. Es equivalente a escribir el código en C#:
void Select (int a, int b)
{
if (c = ...) then {...}
int c = a+b;
}
Al igual que en C# este código no se compilará porque la variable c
se utiliza antes se define, la instrucción SELECT anterior no se compilará correctamente porque el alias c
es referenciado más abajo en el árbol de lo que realmente está definido.
Desafortunadamente, a diferencia de las reglas bien conocidas del análisis sintáctico del lenguaje C/C#, las reglas SQL de cómo se construye el árbol de consulta son de alguna manera esotéricas. Hay una breve mención de ellos en Single SQL Statement Processing pero una discusión detallada de cómo se crean, y qué orden es válida y qué no, no sé de ninguna fuente. No estoy diciendo que no haya buenas fuentes, estoy seguro de que algunos de los buenos libros SQL que existen cubren este tema.
Tenga en cuenta que el orden del árbol de sintaxis no coincide con el orden visual del texto SQL.Por ejemplo, la cláusula ORDER BY suele ser la última en el texto SQL, pero como árbol de sintaxis se encuentra por encima de todo (ordena output de SELECT, por lo que se encuentra sobre las columnas SELECTed por así decirlo) y como tal es es válida para hacer referencia al c
alias:
SELECT a+b as c
FROM t
ORDER BY c;
Actualizado
en realidad no es lo siguiente: Logical Processing Order of the SELECT statement
The following steps show the logical processing order, or binding order, for a SELECT statement. This order determines when the objects defined in one step are made available to the clauses in subsequent steps. For example, if the query processor can bind to (access) the tables or views defined in the FROM clause, these objects and their columns are made available to all subsequent steps. Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. However, they can be referenced by subsequent clauses such as the ORDER BY clause. Note that the actual physical execution of the statement is determined by the query processor and the order may vary from this list.
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE or WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- TOP
Fuera de tema, pero es probable que sea mucho mejor que la UDF zanjas y haciendo que la línea lógica. –