with una que instruccion cte consulta comando sql postgresql common-table-expression recursive-query arel

sql - que - CTE mĂșltiple en una sola consulta



with as() sql (2)

Sí. No repites el WITH . Solo usa una coma:

WITH cte1 AS ( ... ), cte2 AS ( ... ), cte3 AS ( ... ) SELECT ... FROM ''cte3'' WHERE ...

Y: utilice solo comillas simples para las constantes de cadena y fecha. No los use para alias de columna. No están permitidos para nombres CTE de todos modos.

¿Es posible combinar múltiples CTE en una sola consulta con arel ? Estoy buscando una forma de obtener resultados como este:

WITH ''cte1'' AS ( ... ), WITH RECURSIVE ''cte2'' AS ( ... ), WITH ''cte3'' AS ( ... ) SELECT ... FROM ''cte3'' WHERE ...

Como puede ver, tengo un CTE recursivo y dos no recursivos.


Use la palabra clave WITH una vez en la parte superior. Si alguna de sus expresiones de tabla comunes (CTE) es recursiva (rCTE), debe agregar la palabra clave RECURSIVE en la parte superior también una vez , incluso si no todos los CTE son recursivos:

WITH RECURSIVE cte1 AS (...) -- can still be non-recursive , cte2 AS (SELECT ... UNION ALL SELECT ...) -- recursive term , cte3 AS (...) SELECT ... FROM cte3 WHERE ...

El manual:

Si se especifica RECURSIVE , permite que una subconsulta SELECT haga referencia a sí misma por su nombre.

El énfasis audaz es mío. Y, aún más perspicaz:

Otro efecto de RECURSIVE es que las consultas WITH no necesitan ordenarse : una consulta puede hacer referencia a otra que se encuentra más adelante en la lista. (Sin embargo, las referencias circulares, o recursión mutua, no se implementan). Sin RECURSIVE , las consultas WITH solo pueden hacer referencia a consultas de hermanos WITH que se encuentran anteriormente en la lista WITH .

El énfasis audaz es mío nuevamente. Esto significa que el orden de las cláusulas WITH tiene sentido cuando se ha utilizado la palabra clave RECURSIVE .

Por cierto, dado que cte1 y cte2 en el ejemplo no están referenciados en el SELECT externo y son comandos SELECT simples (sin efectos colaterales), nunca se ejecutan (a menos que se haga referencia en cte3 ).