Oracle11g Oracle-查询块中需要Connect By子句
我想在Case语句中使用下面语法中的Month列。创建子查询时,我收到查询块中所需的Oracle错误01788 Connect By子句。如何利用子查询中case station中的Month列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
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”