2017-01-26 6 views
0

Пожалуйста, обратите внимание на следующие Vertica SQLCODE:Vertica - с п не признается в фактическом запросе

WITH date_range AS 
    (SELECT YEAR(now() - interval '1' MONTH) ||MONTH(now() - interval '1' MONTH) ||'#'||DATE(TRUNC(now() - interval '1' MONTH, 'mm')) ||'#'||DATE(TRUNC(now(), 'mm') - interval '1' DAY)        AS month1 
       , YEAR(now() - interval '2' MONTH) ||MONTH(now() - interval '2' MONTH) ||'#'||DATE(TRUNC(now() - interval '2' MONTH, 'mm')) ||'#'||DATE(TRUNC(now() - interval '1' MONTH, 'mm') - interval '1' DAY) AS month2 
    ) 
SELECT regexp_substr(
    (SELECT month1 
      FROM date_range), '[^#]*', 1, 1) 

У меня есть 420 строк длиной запроса, и мне нужно использовать «MONTH1» и «Month2 «как переменные много раз в моем коде. К сожалению, Vertica по-прежнему не поддерживает переменные, поэтому вместо этого я попытался использовать предложение WITH. К сожалению, это не работает, как я получаю следующее сообщение об ошибке:

(4566) ERROR: Relation "date_range" does not exist 

Да поможет мне Бог (или переполнения стека)

+0

P.S. для простого обслуживания кода, пожалуйста, не говорите мне удалить «WITH» и просто используйте весь «SELECT YEAR (now() - interval« 1 »MONTH). MONTH (now() - interval '1' MONTH) || '#' || DATE (TRUNC (now() - interval '1' MONTH, 'mm')) || '#' || DATE (TRUNC (now(), 'mm') - interval ' 1 'DAY) '. Он повторяется как минимум 10 раз в моем коде (это эффективно? Да, это так. Это часть автоматически сгенерированного предупреждения. Почему бы вам не использовать join? Потому что это весь код, во многих вложенных запросах и т. Д. Многие Спасибо заранее! –

ответ

0

Я думаю, что это вопрос вы хотите:

WITH date_range AS (
     SELECT YEAR(now() - interval '1' MONTH) ||MONTH(now() - interval '1' MONTH) ||'#'||DATE(TRUNC(now() - interval '1' MONTH, 'mm')) ||'#'||DATE(TRUNC(now(), 'mm') - interval '1' DAY)        AS month1, 
      YEAR(now() - interval '2' MONTH) ||MONTH(now() - interval '2' MONTH) ||'#'||DATE(TRUNC(now() - interval '2' MONTH, 'mm')) ||'#'||DATE(TRUNC(now() - interval '1' MONTH, 'mm') - interval '1' DAY) AS month2 
    ) 
SELECT regexp_substr(month1, '[^#]*', 1, 1) 
FROM date_range; 

В реальном запросе, вы могли бы сделать это так:

SELECT regexp_substr(dr.month1, '[^#]*', 1, 1) 
FROM date_range dr CROSS JOIN 
    . . .; 

Я часто называю такие CTE params, чтобы подчеркнуть, что они предоставляют параметры для запроса.

+0

Спасибо, как я пропустил это ... –