【问题标题】:Referancing value from select column in where clause : Oracle从 where 子句中的选择列中引用值:Oracle
【发布时间】:2018-11-28 16:43:23
【问题描述】:

我的表格如下

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 列中,我想要的是给定模块名称的问题总数。因此,在上述情况下,Total 列的第一行和第二行的值为 2(因为 IT 合规性有 2 个问题),第三行的值为 1(因为风险评估存在一个问题)。

本质上,我要实现的是在最后一个where子句中替换当前行的MODULE_NAME。如何使用查询来实现这一点?

【问题讨论】:

    标签: oracle plsql oracle11g


    【解决方案1】:

    好的,这个条件

    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
    

    而不是您的子查询

    【讨论】:

    • 感谢 Marcin 的帮助。您的两种方法都有效!即使我想在 with 子句中为 select 语句创建两个别名,但想不出任何方法。我很傻,我没想到在子查询中这样做:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多