根据结果​​修改oracle的cusor结果

时间:2015-10-27 22:17:46

标签: oracle stored-procedures

我有一个返回引用游标的存储过程。我需要做的是进一步过滤结果。由于事情受到保护,我不确定我能提供多少信息。在结果中有一个'Editedflag'列。如果该列值为'Y',我需要获取'PassID'列值并找到具有相同'PassID'的其他结果并将其从结果中删除。对于这类问题我甚至不知道谷歌会是什么。感谢。

SELECT  a.log_curv_id LogCurveId
        ,a.log_curv_type_id LogCurveTypeId
        ,c.log_curv_type_desc LogCurveTypeDesc
        ,a.cmpl_fac_id CompletionId
        ,d.fac_nme CompletionName
        ,b.edtd_curv_indc EditedIndicator
        ,b.stsfr_qlty_indc SatisfactoryIndicator
        ,a.top_md_qty TopMeasuredDepth
        ,a.base_md_qty BaseMeasuredDepth
        ,NVL(TO_NUMBER(eds.p_surv_load.fget_log_curv_spec(a.log_curv_id,2248)),NULL) FlowRate
        ,NVL(TO_NUMBER(eds.p_surv_load.fget_log_curv_spec(a.log_curv_id,800)),NULL) TubingPressure
        ,NVL(TO_NUMBER(eds.p_surv_load.fget_log_curv_spec(a.log_curv_id,2249)),NULL) LossAbove
        ,NVL(TO_NUMBER(eds.p_surv_load.fget_log_curv_spec(a.log_curv_id,2250)),NULL)LossBelow
        ,b.lggg_tlstr_pass_id PassId
        FROM eds.log_curv a,
        eds.acqn_curv b,
        eds.log_curv_type c,
        eds.fac_nme d
        WHERE a.log_curv_id = b.log_curv_id
        AND b.lggg_tlstr_pass_id = 188481
        AND a.log_curv_type_id = c.log_curv_type_id
        AND NVL(a.cmpl_fac_id,0) = d.fac_id(+)
        AND d.term_dttm IS NULL
        AND a.del_indc = 'N'
        AND b.del_indc = 'N'
        AND c.del_indc = 'N'
        AND d.fac_nme_type_cde = 'NME'  /*12/09/2013 ksk NEW*/
        AND d.del_indc = 'N';           /*12/09/2013 ksk NEW*/

结果

enter image description here

您会注意到结果上的完成ID是相同的。我需要在Editedindicator列中检查Y标志,如果存在,则查找具有匹配的completionid的结果并将其删除。

1 个答案:

答案 0 :(得分:2)

with yq as (
select  a.log_curv_id, a.log_curv_type_id, c.log_curv_type_desc, a.cmpl_fac_id, 
        d.fac_nme, b.edtd_curv_indc, b.stsfr_qlty_indc, a.top_md_qty, a.base_md_qty, 
        b.lggg_tlstr_pass_id PassId,
        count (case when edtd_curv_indc = 'Y' then 1 end) 
         over (partition by b.lggg_tlstr_pass_id) cnt
  from log_curv a
  join acqn_curv b     on b.del_indc = 'N' and a.log_curv_id = b.log_curv_id
  join log_curv_type c on c.del_indc = 'N' and a.log_curv_type_id = c.log_curv_type_id
  left join fac_nme d  on nvl(a.cmpl_fac_id,0) = d.fac_id and d.del_indc = 'N' 
                          and d.term_dttm is null and d.fac_nme_type_cde = 'NME'
  where b.lggg_tlstr_pass_id = 188481 and a.del_indc = 'N')
select yq.* from yq where (cnt>0 and edtd_curv_indc='Y') or cnt = 0

SQLFiddle demo

在上面的查询中,我使用了分析count()函数来检查是否存在edtd_curv_indc =' Y'对于特定的PassId。 如果是这样,根据条件where (cnt>0 and edtd_curv_indc='Y') or cnt = 0,只会显示这些行,如果不是,则显示其余行。 在回答中,我使用函数fget_log_curv_spec忽略了列,它们对于此示例并不重要。 我还将旧式连接改为ansi语法。