表内部通过having子句中的sum函数连接到自身

时间:2014-05-07 20:05:30

标签: sql oracle

我有一个返回错误结果的查询:

select sum(count(distinct stcr1.sfrstcr_pidm)) as sum_all
from saturn.sfrstcr stcr1
  inner join saturn.sfrstcr stcr2
    on stcr1.sfrstcr_pidm = stcr2.sfrstcr_pidm
where stcr1.sfrstcr_term_code = '200808'
  and stcr2.sfrstcr_term_code = '200908'
group by stcr1.sfrstcr_pidm
having sum(stcr1.sfrstcr_credit_hr) >= 12

我希望查询能够为stcr1.sfrstcr_pidm提供总数stcr1.sfrstcr_credit_hr至少为12的stcr2,并显示在saturn.sfrstcr中。虽然sfrstcr_pidm中的每条记录都是唯一的,但stcr1.sfrstcr_credit_hr的列中可以包含任意数量的重复条目。

但是,查询会为stcr2.sfrstcr_pidm的每个实例获取stcr1.sfrstcr_credit_hr的总和。因此,例如,如果stcr2.sfrstcr_pidm的总和实际为6,但有两个stcr1.sfrstcr_pidm实例加入stcr1.sfrstcr_pidm,则查询得到12的总和,并错误地添加having sum(stcr1.sfrstcr_credit_hr) >= 12 结果。至少我认为会发生什么。

如果我更换

having (select sum(stcr3.sfrstcr_credit_hr)
        from saturn.sfrstcr stcr3
        where stcr1.sfrstcr_pidm = stcr3.sfrstcr_pidm
          and stcr3.sfrstcr_term_code = '200808') >= 12

{{1}}

我得到了正确的结果,但似乎应该有更好的方法来执行此操作,而不会在having子句中涉及子查询。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

"我希望查询给出stcr1.sfrstcr_pidm的数量,其总stcr1.sfrstcr_credit_hr至少为12,并且存在于stcr2中。"

如果我没有错过这个问题的一些细微差别,这似乎是一个相当直接的方法:

select count(distinct sfrstcr_pidm) 
from 
  (
    select sfrstcr_pidm
    from   saturn.sfrstcr
    where  sfrstcr_term_code = '200808'
           and sfrstcr_pidm in 
               (select sfrstcr_pidm
                from   saturn.sfrstcr
                where  sfrstcr_term_code = '200809')
    group by sfrstcr_pidm
    having sum(sfrstcr_credit_hr) >= 12
  )