Una expresión de tabla común (CTE) es una subconsulta con nombre cuyo alcance se limita a una sola consulta. Puede considerarla como una vista temporal definida en la cláusula WITH que permite asignar un nombre a un conjunto de resultados intermedio y hacer referencia a él dentro de la misma instrucción. Las CTE facilitan la lectura y el mantenimiento de consultas complejas al dividirlas en bloques reutilizables con nombres descriptivos.
Sintaxis
WITH expression_name[(column_name [,...])]
AS
(CTE_definition)
SQL_statement;
La cláusula WITH consta de cuatro componentes:
|
Componente |
Obligatorio |
Descripción |
|
Nombre de la CTE |
Sí |
Nombre asignado a la CTE. Utilice este nombre más adelante en la misma instrucción SQL. |
|
Lista de columnas |
No |
Nombres de las columnas de salida entre paréntesis, separados por comas. La cantidad y los tipos de datos deben coincidir con las columnas que devuelve la cláusula AS. Si se omite, la CTE hereda los nombres de columna de la cláusula AS. |
|
Cláusula AS |
Sí |
Consulta que genera el conjunto de resultados de la CTE. La CTE devuelve exactamente lo que produce esta consulta. |
|
Instrucción SQL principal |
Sí |
Consulta externa que hace referencia a la CTE por su nombre. |
Limitaciones
Actualmente, las CTE solo son compatibles con instrucciones SELECT.
Ejemplos
CTE sencilla
Defina una CTE llamada T_CTE y seleccione todas sus filas directamente:
WITH T_CTE (i1_cte,i2_cte) AS (SELECT i1,i2 FROM t1)
SELECT * FROM T_CTE
CTE en una cláusula JOIN
Haga referencia a la CTE en un JOIN para combinarla con otra tabla:
WITH T_CTE (i1_cte,i2_cte) AS (SELECT i1,i2 FROM t1)
SELECT * FROM t2 JOIN T_CTE ON t2.i1 = T_CTE.i1_cte AND t2.i2 = T_CTE.i2_cte
CTE en una subconsulta WHERE EXISTS
Utilice la CTE como filtro dentro de una cláusula WHERE EXISTS:
WITH T_CTE (i1_cte,i2_cte) AS (SELECT i1,i2 FROM t1)
SELECT * FROM t2 WHERE EXISTS (SELECT * FROM T_CTE WHERE t2.i1 = i1_cte AND t2.i2 = i2_cte)
Preguntas frecuentes
¿El uso de una CTE ralentiza mi consulta?
No. Una CTE define un conjunto de resultados temporal, pero no se ejecuta como un paso independiente. La base de datos expande la definición de la CTE al generar el plan de ejecución, por lo que tanto la CTE como la consulta principal se optimizan de forma conjunta. El plan de ejecución resultante no es más complejo que el de una consulta equivalente escrita sin CTE y el rendimiento es idéntico.