2017-01-06 2 views
0

Я хотел бы использовать столбцы месяца в приведенном ниже синтаксисе в Case Statement. Когда я создаю дополнительный запрос, я получаю ошибку Oracle 01788. Подключить по требованию в блоке запроса. Как можно использовать столбец «Месяц» в статусе дела в подзапросе?Oracle - Connect By Clause Требуется в блоке запроса

TO_CHAR(ADD_MONTHS(TRUNC(StartDate, 'MM'), LEVEL - 1), 'YYYYMM') AS Month 

Запрос ниже:

SELECT 
CASE 
    WHEN first_assgn_dt_YYYYMM <= Month 
    THEN 0 
    WHEN EndDate < LAST_DAY(EndDate) AND EndDate != sysdate 
AND LEVEL = 1 + MONTHS_BETWEEN(TRUNC(EndDate,'MM'),TRUNC(StartDate,'MM')) 
    THEN 0 
    ELSE 1 
     END AS active_at_month_end 

     FROM (
WITH 
    ActiveMemberData (ID,StartDate,EndDate,first_assgn_dt,first_assgn_dt_YYYYMM) AS (
     SELECT DISTINCT 
     x.ID, 
     TRUNC(x.start_dt) AS StartDate, 
     CASE WHEN TRUNC(X.END_DT) = '1-JAN-3000' THEN SYSDATE ELSE TO_DATE(X.END_DT) END AS EndDate, 
     x.first_assgn_dt, 
     TO_CHAR(first_assgn_dt,'YYYYMM') AS first_assgn_dt_YYYYMM 

FROM X 
LEFT JOIN D ON X.MID = D.ID 

WHERE 1=1 

           )         
--------------------------------------------------          
    SELECT DISTINCT 
ID, 
first_assgn_dt, 
first_assgn_dt_YYYYMM, 
StartDate, 
TO_CHAR(StartDate,'YYYYMM') AS StartDate_YYYYMM, 
EndDate, 
TO_CHAR(ADD_MONTHS(TRUNC(StartDate, 'MM'), LEVEL - 1), 'YYYYMM') AS Month, 
LAST_DAY(EndDate) AS LastDayOfMonth 

FROM ActiveMemberData 

WHERE 1=1 
------------------------------------------------------------------------------------ 
CONNECT BY LEVEL <= 1 + MONTHS_BETWEEN(TRUNC(EndDate,'MM'), TRUNC(StartDate,'MM')) 
    AND PRIOR ID = ID AND PRIOR STARTDATE = STARTDATE 
    AND PRIOR sys_guid() IS NOT NULL   
         ) Z 
WHERE 1=1 

ORDER BY 
ID, 
Month 

ответ

1

Это не имеет ничего общего с попыткой обратиться к Month с точки зрения инлайн; это нормально. Это отдельная ссылка на level, которая вызывает ошибку.

Если вы хотите, чтобы иметь возможность видеть level с вашей точки зрения инлайн во внешнем запросе, как вы с этой линии:

AND LEVEL = 1 + MONTHS_BETWEEN(TRUNC(EndDate,'MM'),TRUNC(StartDate,'MM')) 

, то вы должны включить его в списке выбора - с псевдоним - и затем ссылаться на этот псевдоним:

SELECT 
CASE 
... 
AND LEVEL_ALIAS = 1 + MONTHS_BETWEEN(TRUNC(EndDate,'MM'),TRUNC(StartDate,'MM')) 
... 
FROM (
... 
    SELECT DISTINCT 
    LEVEL as LEVEL_ALIAS, 
    ID, 
... 

Вы можете назвать псевдоним, что бы вы ни хотели, конечно; вы просто не можете использовать зарезервированное слово level.

Все, что вы хотите видеть во внешнем запросе, всегда должно быть в списке выбора встроенного представления, но обычно вы можете сохранить имя исходного столбца; вы должны использовать псевдоним для выражения или pseucocolumn, хотя это и происходит здесь.

0

Вам не нужно использовать псевдоним для зарезервированного слова. Просто добавьте двойные кавычки и уменьшите его, то есть «УРОВЕНЬ»