14

Возможно ли комбинировать несколько CTE в одном запросе с arel? Я ищу способ, чтобы получить результат, как это:Несколько CTE в одном запросе

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

Как вы можете видеть, у меня есть один рекурсивный КТР и два не рекурсивные.

+0

Название CTE - это идентификатор_идентификатора. Идентификаторы не должны быть заключены в одинарные кавычки. 'WITH 'cte1'' недействителен (как, например,' from foobar as' bla'') –

ответ

25

Используйте ключевое слово WITHраз сверху и, если любой из ваших общих табличных выражений (КТР) являются рекурсивными (РКТО) вы должны добавить ключевое слово RECURSIVE на вершине также, даже если не все, CTE рекурсивны:

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

Quoting the manual:

Если RECURSIVE указано, что все ows a SELECT Подзапрос к ссылку сам по имени.

Смелый акцент мой. И даже более проницательны:

Другой эффект RECURSIVE что WITH запросы не должны быть заказаны: запрос может ссылаться на другой, который позже в списке. (Тем не менее, циклических ссылки, или взаимная рекурсия, не выполняется.) Без RECURSIVE, WITH запросов могут ссылаться только на двойники WITH запросов, которые ранее в WITH списке.

Смелый акцент мой снова. Это означает, что порядок статей WITH равен бессмысленным, когда было использовано ключевое слово RECURSIVE.

BTW, так как cte1 и cte2 не упоминается в наружной SELECT и просты SELECT команд сами (без залога эффектов), они никогда не выполняются (если не упоминаются в cte3).

9

Да. Вы не повторяете WITH. Вы просто используете запятую:

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

И: Используйте только одинарные кавычки для констант строк и дат. Не используйте их для псевдонимов столбцов. В любом случае они не допускаются для имен CTE.

+1

Но если мне нужен один рекурсивный CTE с 2 нерекурсивными? – axvm

 Смежные вопросы

  • Нет связанных вопросов^_^