使用子查询的左外连接上的无效标识符错误消息
Invalid Identifier error message on left outer join using subqueries
此查询仅在我用“*”替换前 select 列时有效。我一直在阅读其他与我类似的问题,但我无法将他们的逻辑应用于我的情况。除了根据 "where" 子句中的状态更改之外,所有子查询都是相同的。
每天都有更多的成功。失败和警告不会每天都发生,所以它们有一些我想变成 0 的空值。我希望所有成功、警告和失败都与 a.Start_date.
相关
Select a.START_DATE, a.Successes, b.START_DATE, b.Failures, c.START_DATE, c.WARNINGS
FROM
(
Select
(Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END) "START_DATE",
NVL(count(job_id),0) as "Successes"
from NI_INFA_ACTIVITY_LOG_V
where State = 1
and
(:P1_JOB_SIZE_CHOOSER = 'Tiny' AND (1440*(END_TIME - START_TIME)) <= 1
OR
:P1_JOB_SIZE_CHOOSER = 'Small' AND (1440*(END_TIME - START_TIME)) > 1 AND
(1440*(END_TIME - START_TIME)) <= 5
OR
:P1_JOB_SIZE_CHOOSER = 'Medium' AND (1440*(END_TIME - START_TIME)) > 5 AND
(1440*(END_TIME - START_TIME)) <= 20
OR
:P1_JOB_SIZE_CHOOSER = 'Large' AND ((1440*(END_TIME - START_TIME)) > 20)
OR
:P1_JOB_SIZE_CHOOSER NOT IN('Small','Medium','Large','Tiny') AND (1440*(END_TIME - START_TIME)) > 0)
group by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
order by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
) a
left outer join
(
Select
(Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END) "START_DATE",
nvl(count(job_id),0) as "Failures"
from NI_INFA_ACTIVITY_LOG_V
where State = 3
and
(:P1_JOB_SIZE_CHOOSER = 'Tiny' AND (1440*(END_TIME - START_TIME)) <= 1
OR
:P1_JOB_SIZE_CHOOSER = 'Small' AND (1440*(END_TIME - START_TIME)) > 1 AND
(1440*(END_TIME - START_TIME)) <= 5
OR
:P1_JOB_SIZE_CHOOSER = 'Medium' AND (1440*(END_TIME - START_TIME)) > 5 AND
(1440*(END_TIME - START_TIME)) <= 20
OR
:P1_JOB_SIZE_CHOOSER = 'Large' AND ((1440*(END_TIME - START_TIME)) > 20)
OR
:P1_JOB_SIZE_CHOOSER NOT IN('Small','Medium','Large','Tiny') AND (1440*(END_TIME - START_TIME)) > 0)
group by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
order by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
) b
on
a.START_DATE = b.START_DATE
left outer join
(
Select
(Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END) "START_DATE",
nvl(count(job_id),0) as "Warnings"
from NI_INFA_ACTIVITY_LOG_V
where State = 2
and
(:P1_JOB_SIZE_CHOOSER = 'Tiny' AND (1440*(END_TIME - START_TIME)) <= 1
OR
:P1_JOB_SIZE_CHOOSER = 'Small' AND (1440*(END_TIME - START_TIME)) > 1 AND
(1440*(END_TIME - START_TIME)) <= 5
OR
:P1_JOB_SIZE_CHOOSER = 'Medium' AND (1440*(END_TIME - START_TIME)) > 5 AND
(1440*(END_TIME - START_TIME)) <= 20
OR
:P1_JOB_SIZE_CHOOSER = 'Large' AND ((1440*(END_TIME - START_TIME)) > 20)
OR
:P1_JOB_SIZE_CHOOSER NOT IN('Small','Medium','Large','Tiny') AND (1440*(END_TIME - START_TIME)) > 0)
group by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
order by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
) c
on
a.START_DATE = c.START_DATE
ORDER BY
a.START_DATE
最后,我希望结果是这样的:
Start_Date Successes Warnings Failures
6/1/2015 5 0 3
........ 8 15 4
6/30/2015 9 1 0
替换
Select a.START_DATE, a.Successes, b.START_DATE, b.Failures, c.START_DATE, ...
经过
Select a."START_DATE", a."Successes", b."START_DATE", b."Failures", c."START_DATE", ...
您在子查询中为(某些)别名使用了带引号的标识符,因此您也必须在外部 select 中引用这些别名,并且与您使用的大小写完全匹配:
Select a.START_DATE, a."Successes",
b.START_DATE, b."Failures",
c.START_DATE, c."Warnings"
...
带引号的标识符很麻烦。如果您希望列标题为 mixed-case ,您可以在子查询中使用不带引号的标识符,并在外部查询中应用最终带引号的名称作为另一个别名;或者让客户处理该显示问题。
并且由于 start_date
是连接条件,您可能不需要所有三个引用;并在结果集中获得零,你需要 NVL 失败和警告计数,所以你也可以使用不带引号的标识符:
Select a.start_date "Start date", a."Successes",
nvl(b.failures, 0) "Failures", nvl(c.warnings, 0) "Warnings"
...
NVL(count(job_id),0) as successes
...
您已经拥有的计数附近的 NVL 没有做任何事情 - 它需要在外部查询中而不是如图所示 - 因为如果计数为空,则没有开始日期值可分组。
如果子查询真的如此相似,您可以将其简化为具有三个 selective 计数的单个查询级别;类似于:
Select to_char(Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END, 'MM/DD/YYYY') as "Start date",
count(case when State = 1 then job_id end) as "Successes",
count(case when State = 3 then job_id end) as "Failures",
count(case when State = 2 then job_id end) as "Warnings"
from NI_INFA_ACTIVITY_LOG_V
where (:P1_JOB_SIZE_CHOOSER = 'Tiny'
AND (1440*(END_TIME - START_TIME)) <= 1)
OR (:P1_JOB_SIZE_CHOOSER = 'Small'
AND (1440*(END_TIME - START_TIME)) > 1
AND (1440*(END_TIME - START_TIME)) <= 5)
OR (:P1_JOB_SIZE_CHOOSER = 'Medium'
AND (1440*(END_TIME - START_TIME)) > 5
AND (1440*(END_TIME - START_TIME)) <= 20)
OR (:P1_JOB_SIZE_CHOOSER = 'Large'
AND (1440*(END_TIME - START_TIME)) > 20)
OR (:P1_JOB_SIZE_CHOOSER NOT IN ('Small','Medium','Large','Tiny')
AND (1440*(END_TIME - START_TIME)) > 0)
group by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
order by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END;
你的括号似乎也不对劲,所以我试图纠正这些,但你可能是故意做的我没有遵循...
此查询仅在我用“*”替换前 select 列时有效。我一直在阅读其他与我类似的问题,但我无法将他们的逻辑应用于我的情况。除了根据 "where" 子句中的状态更改之外,所有子查询都是相同的。
每天都有更多的成功。失败和警告不会每天都发生,所以它们有一些我想变成 0 的空值。我希望所有成功、警告和失败都与 a.Start_date.
相关 Select a.START_DATE, a.Successes, b.START_DATE, b.Failures, c.START_DATE, c.WARNINGS
FROM
(
Select
(Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END) "START_DATE",
NVL(count(job_id),0) as "Successes"
from NI_INFA_ACTIVITY_LOG_V
where State = 1
and
(:P1_JOB_SIZE_CHOOSER = 'Tiny' AND (1440*(END_TIME - START_TIME)) <= 1
OR
:P1_JOB_SIZE_CHOOSER = 'Small' AND (1440*(END_TIME - START_TIME)) > 1 AND
(1440*(END_TIME - START_TIME)) <= 5
OR
:P1_JOB_SIZE_CHOOSER = 'Medium' AND (1440*(END_TIME - START_TIME)) > 5 AND
(1440*(END_TIME - START_TIME)) <= 20
OR
:P1_JOB_SIZE_CHOOSER = 'Large' AND ((1440*(END_TIME - START_TIME)) > 20)
OR
:P1_JOB_SIZE_CHOOSER NOT IN('Small','Medium','Large','Tiny') AND (1440*(END_TIME - START_TIME)) > 0)
group by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
order by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
) a
left outer join
(
Select
(Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END) "START_DATE",
nvl(count(job_id),0) as "Failures"
from NI_INFA_ACTIVITY_LOG_V
where State = 3
and
(:P1_JOB_SIZE_CHOOSER = 'Tiny' AND (1440*(END_TIME - START_TIME)) <= 1
OR
:P1_JOB_SIZE_CHOOSER = 'Small' AND (1440*(END_TIME - START_TIME)) > 1 AND
(1440*(END_TIME - START_TIME)) <= 5
OR
:P1_JOB_SIZE_CHOOSER = 'Medium' AND (1440*(END_TIME - START_TIME)) > 5 AND
(1440*(END_TIME - START_TIME)) <= 20
OR
:P1_JOB_SIZE_CHOOSER = 'Large' AND ((1440*(END_TIME - START_TIME)) > 20)
OR
:P1_JOB_SIZE_CHOOSER NOT IN('Small','Medium','Large','Tiny') AND (1440*(END_TIME - START_TIME)) > 0)
group by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
order by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
) b
on
a.START_DATE = b.START_DATE
left outer join
(
Select
(Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END) "START_DATE",
nvl(count(job_id),0) as "Warnings"
from NI_INFA_ACTIVITY_LOG_V
where State = 2
and
(:P1_JOB_SIZE_CHOOSER = 'Tiny' AND (1440*(END_TIME - START_TIME)) <= 1
OR
:P1_JOB_SIZE_CHOOSER = 'Small' AND (1440*(END_TIME - START_TIME)) > 1 AND
(1440*(END_TIME - START_TIME)) <= 5
OR
:P1_JOB_SIZE_CHOOSER = 'Medium' AND (1440*(END_TIME - START_TIME)) > 5 AND
(1440*(END_TIME - START_TIME)) <= 20
OR
:P1_JOB_SIZE_CHOOSER = 'Large' AND ((1440*(END_TIME - START_TIME)) > 20)
OR
:P1_JOB_SIZE_CHOOSER NOT IN('Small','Medium','Large','Tiny') AND (1440*(END_TIME - START_TIME)) > 0)
group by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
order by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
) c
on
a.START_DATE = c.START_DATE
ORDER BY
a.START_DATE
最后,我希望结果是这样的:
Start_Date Successes Warnings Failures
6/1/2015 5 0 3
........ 8 15 4
6/30/2015 9 1 0
替换
Select a.START_DATE, a.Successes, b.START_DATE, b.Failures, c.START_DATE, ...
经过
Select a."START_DATE", a."Successes", b."START_DATE", b."Failures", c."START_DATE", ...
您在子查询中为(某些)别名使用了带引号的标识符,因此您也必须在外部 select 中引用这些别名,并且与您使用的大小写完全匹配:
Select a.START_DATE, a."Successes",
b.START_DATE, b."Failures",
c.START_DATE, c."Warnings"
...
带引号的标识符很麻烦。如果您希望列标题为 mixed-case ,您可以在子查询中使用不带引号的标识符,并在外部查询中应用最终带引号的名称作为另一个别名;或者让客户处理该显示问题。
并且由于 start_date
是连接条件,您可能不需要所有三个引用;并在结果集中获得零,你需要 NVL 失败和警告计数,所以你也可以使用不带引号的标识符:
Select a.start_date "Start date", a."Successes",
nvl(b.failures, 0) "Failures", nvl(c.warnings, 0) "Warnings"
...
NVL(count(job_id),0) as successes
...
您已经拥有的计数附近的 NVL 没有做任何事情 - 它需要在外部查询中而不是如图所示 - 因为如果计数为空,则没有开始日期值可分组。
如果子查询真的如此相似,您可以将其简化为具有三个 selective 计数的单个查询级别;类似于:
Select to_char(Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END, 'MM/DD/YYYY') as "Start date",
count(case when State = 1 then job_id end) as "Successes",
count(case when State = 3 then job_id end) as "Failures",
count(case when State = 2 then job_id end) as "Warnings"
from NI_INFA_ACTIVITY_LOG_V
where (:P1_JOB_SIZE_CHOOSER = 'Tiny'
AND (1440*(END_TIME - START_TIME)) <= 1)
OR (:P1_JOB_SIZE_CHOOSER = 'Small'
AND (1440*(END_TIME - START_TIME)) > 1
AND (1440*(END_TIME - START_TIME)) <= 5)
OR (:P1_JOB_SIZE_CHOOSER = 'Medium'
AND (1440*(END_TIME - START_TIME)) > 5
AND (1440*(END_TIME - START_TIME)) <= 20)
OR (:P1_JOB_SIZE_CHOOSER = 'Large'
AND (1440*(END_TIME - START_TIME)) > 20)
OR (:P1_JOB_SIZE_CHOOSER NOT IN ('Small','Medium','Large','Tiny')
AND (1440*(END_TIME - START_TIME)) > 0)
group by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END
order by Case :P1_DATE_CHOOSER
WHEN 'Daily' THEN trunc(start_time)
WHEN 'Weekly' THEN trunc(start_time, 'WW')
WHEN 'Monthly' THEN trunc(start_time, 'MM')
END;
你的括号似乎也不对劲,所以我试图纠正这些,但你可能是故意做的我没有遵循...