2016-07-29 32 views
0

我有一个声明,崩溃的日期范围,我得到正确的折叠版本,当通过iteself执行SQL,并将它插入到嵌套表过程我得到一行应该已经折叠到另一行。我得到从不同位置执行相同的语句的2个不同的行数

  SELECT client_pk, 
        plan_id, 
        grp, 
        MIN(start_dt) start_dt, 
        MAX(end_dt) end_dt 
       FROM (
       SELECT client_pk 
         plan_id, 
         start_dt, 
         end_dt, 
         MAX(grp) OVER (PARTITION BY plan_id ORDER BY start_dt ASC) grp 
        FROM (
        SELECT mp.client_pk, 
          mp.plan_id, 
          CASE 
           WHEN (LAG(mp.end_dt) OVER (PARTITION BY mp.plan_id ORDER BY mp.start_dt ASC)) BETWEEN mp.start_dt-1 AND 
                                 NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) 
            THEN NULL 
          ELSE ROWNUM 
          END grp, 
          mp.start_dt, 
          NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) end_dt 
         FROM client_plan mp 
         ) 
        ) 
       GROUP BY grp, plan_id, client_pk 

所以我有一个初步的结果,从最内部查询设置给的ROWNUM:

client_pk PLAN_ID GRP start_dt end_dt 
8752  25171 3 1/1/2016 3/31/2016 
8752  25171 1 2/1/2016 1/31/2016 

,并通过年底的时候作为一个独立的查询执行它适当倒塌

client_pk PLAN_ID GRP start_dt end_dt 
8752  25171 3 1/1/2016 3/31/2016 

但是,当通过将这些记录转储到嵌套表中的过程来运行时,这些嵌套表最终会插入到数据库中,但这两行仍然会返回。

SELECT plan_spans_obj(client_pk, plan_id, start_dt, end_dt) 
     BULK COLLECT INTO plan_spans_ins_tbl 
     FROM ( 
     SELECT client_pk, 
       plan_id, 
       start_dt, 
       end_dt 
     FROM (SELECT client_pk, 
         plan_id, 
         grp, 
         MIN(start_dt) start_dt, 
         MAX(end_dt) end_dt 
        FROM (
        SELECT client_pk 
          plan_id, 
          start_dt, 
          end_dt, 
          MAX(grp) OVER (PARTITION BY plan_id ORDER BY start_dt ASC) grp 
         FROM (
         SELECT mp.client_pk, 
           mp.plan_id, 
           CASE 
            WHEN (LAG(mp.end_dt) OVER (PARTITION BY mp.plan_id ORDER BY mp.start_dt ASC)) BETWEEN mp.start_dt-1 AND 
                                  NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) 
             THEN NULL 
           ELSE ROWNUM 
           END grp, 
           mp.start_dt, 
           NVL(mp.end_dt,to_date('12/31/9999','MM/DD/YYYY')) end_dt 
          FROM client_plan mp 
          ) 
         ) 
        GROUP BY grp, plan_id, client_pk 
       ) 
      ); 

因此,如何会收到来自同一个查询2个不同的结果,只是执行的方式不同,它是根据它执行其中的操作不同的顺序。

此外,额外的记录本质上是一个负的时间跨度,结束日期在开始日期之前,但这是在查询中处理。

+0

您可以添加该client_pk和plan_id的原始数据吗?我很确定这是因为你滥用了'ROWNUM',但是我想在重写它之前能够重现它。 –

回答

0

答案是我没有初始化集合。不能相信它是这样的,但显然如此。似乎现在正在工作。

+0

在批量收集之前,您无需初始化集合。也许你有没有提交的改变或什么?仍然只要它工作.. –

+0

未提交的更改是我的第一个想法...谁知道。 – mathguy

相关问题