Oracle11g Oracle-查询块中需要Connect By子句

Oracle11g Oracle-查询块中需要Connect By子句,oracle11g,Oracle11g,我想在Case语句中使用下面语法中的Month列。创建子查询时,我收到查询块中所需的Oracle错误01788 Connect By子句。如何利用子查询中case station中的Month列 TO_CHAR(ADD_MONTHS(TRUNC(StartDate, 'MM'), LEVEL - 1), 'YYYYMM') AS Month 查询如下: SELECT CASE WHEN first_assgn_dt_YYYYMM <= Month THEN 0

我想在Case语句中使用下面语法中的Month列。创建子查询时,我收到查询块中所需的Oracle错误01788 Connect By子句。如何利用子查询中case station中的Month列

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
选择
案例

当第一次从内联视图中引用
Month
与尝试无关时;那很好。导致错误的是对
级别的单独引用

如果希望能够从外部查询中的内联视图中查看
级别
,就像您使用此行一样:

 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


希望在外部查询中可见的任何内容都必须位于内联视图的选择列表中,但通常可以保留原始列名;但是,必须为表达式或伪列使用别名,这里就是这种情况。

不必为保留字使用别名。只需添加双引号并大写,即“LEVEL”