在where子句的select列中引用值:Oracle

时间:2018-11-26 13:54:14

标签: oracle plsql oracle11g

我的表格如下

MS_ISM_ISSUE

ISSUE_ID  ISSUE_DUE_DATE  ISSUE_SOURCE_TYPE
I1        25-11-2018      1
I2        25-12-2018      1
I3        27-03-2019      2

MS_ISM_SOURCE_SETUP

SOURCE_ID MODULE_NAME
1         IT-Compliance
2         Risk Assessment

我写了以下查询。

with rs as
(select 
count(ISSUE_ID) as ISSUE_COUNT, src.MODULE_NAME, 
case 
when ISSUE_DUE_DATE<sysdate then 'Overdue'
when ISSUE_DUE_DATE between sysdate and sysdate + 90 then 'Within 3 months'
when ISSUE_DUE_DATE>sysdate+90 then 'Beyond 90 days'
end as date_range
from MS_ISM_ISSUE issue, MS_ISM_SOURCE_SETUP src
where issue.Issue_source_type = src.source_id
group by src.MODULE_NAME, case 
when ISSUE_DUE_DATE<sysdate then 'Overdue'
when ISSUE_DUE_DATE between sysdate and sysdate + 90 then 'Within 3 months'
when ISSUE_DUE_DATE>sysdate+90 then 'Beyond 90 days'
end)  
select ISSUE_COUNT,MODULE_NAME, DATE_RANGE,
(select count(ISSUE_COUNT) from rs where rs.MODULE_NAME=MODULE_NAME) as total from rs;

代码输出如下。

ISSUE_COUNT  MODULE_NAME      DATE_RANGE     Total
1            IT-Compliance    Overdue           3
1            IT-Compliance    Within 3 months   3
1            Risk Assessment  Beyond 90 days    3

结果是正确的,直到第3列。在第4列中,我想要的是给定模块名称的问题总数。因此,在上述情况下,“总计”列的第一行和第二行的值为2(因为有2个IT遵从性问题),第三行的值为1(因为存在一个风险评估问题)。

基本上,我想实现的是在最后的where子句中替换当前行的MODULE_NAME。如何使用查询实现这一目标?

1 个答案:

答案 0 :(得分:2)

好的,这种情况

where rs.MODULE_NAME=MODULE_NAME

与您写的基本上相同

where MODULE_NAME = MODULE_NAME

这始终是真的(如果module_name中没有空值)。

尝试对内部查询和外部查询使用不同的表别名,例如

select count(ISSUE_COUNT) from rs rs2 where rs2.MODULE_NAME=rs.MODULE_NAME

您也可以在此处尝试使用analytic function,例如

select ISSUE_COUNT,
       MODULE_NAME,
       DATE_RANGE,
       COUNT(ISSUE_COUNT) OVER (PARTITION BY RS.MODULE_NAME) AS TOTAL
  from rs

代替您的子查询