代码之家  ›  专栏  ›  技术社区  ›  John Wick

如何在表1中显示每年的记录,然后在第二个表中自动关联计算值?

  •  1
  • John Wick  · 技术社区  · 7 年前

    因此,我使用分组ID计算/获取大量数据,并尝试

    1)在 计算 为每个不同的年份和创建的表

    2)将与该年相关的计算值插入 计算器 关系表和

    3)将计算值插入值表(这部分相当简单)

    所以下面基本上是我用来获取数据的光标:

    CURSOR a1 is
    select
      to_char(hr, 'yyyy') yyyy,
      sum(value_nb) total,
      max(value_nb) maxval,
      color
      form_field form_field,
      grouping_id(to_char(hr, 'yyyy'), form_field, color) AS group_level_nb
    from
      value v
      left outer join submission_value_rel sv on v.value_id = sv.value_id
      left outer join submission s on sv.submission_id = s.submission_id
    group by cube (to_char(hr, 'yyyy'), form_field_tx, color);
    

    我想要这样的东西:

    计算(表)

    Calculation_ID   Year
         1           2016
         2           2017
         3           2018
    

    值(表)

    Value_ID      Value       Date       Color      Shape    GROUPING_ID
       1           7          2016       Blue        NULL        2 
       2           3          2016       Red         NULL        2
       3           99         2016       Green      Circle       3
       4           1          2017       Blue       Square       3
       5           2          2017       Purple     Square       3
       6           5          2018       Green      Circle       3
       7           4          2018       White      Square       3
    

    计算值(表)

     Calculation_ID    Value_Id
         1                1
         1                2
         1                3
         2                4
         2                5
         3                6
         3                7
    

    我能想到的最好方法是创建两个单独的光标,打开一个光标以插入到 计算 然后关闭它。打开第二个光标以插入到 价值 计算器 然后把它绑在一起。或者只通过一个光标循环,为每个计算/价值关系创建一个计算ID(不是最佳的,但我想这是我最后的方法,我无法找到一种方法来完成上面所示的工作。下面是我在前一句话中描述的“循环方法”的尝试:

    BEGIN 
      Open a1;
      LOOP
      FETCH a1 into a_var;
      EXIT WHEN a1%NOTFOUND;
          IF grouping_id = 2
          THEN
          insert into calculation(calculation_id, year)
                          values (null, a_var.yyyy)
                returning calculation_id into v_calculation_id;
          -- Calculation_id is auto-generated via a trigger / sequence
          insert into value(value_id, value, date, color)
                     values(null, a_var.sum, a_var.color)
                returning value_id into v_value_id;
          -- Value_id is auto-generated via a trigger / sequence
          insert into calculation_Rel(Calculation_id, Value_Id)
                              values (v_calculation_id, v_value_id);
          ELSIF grouping_id = 3
          THEN
          insert into calculation(calculation_id, year)
                          values (null, a_var.yyyy)
                returning calculation_id into v_calculation_id;
          -- Calculation_id is auto-generated via a trigger / sequence
          insert into value(value_id, value, date, color)
                     values(null, a_var.max, a_var.color)
                returning value_id into v_value_id;
          -- Value_id is auto-generated via a trigger / sequence
          insert into calculation_Rel(Calculation_id, Value_Id)
                              values (v_calculation_id, v_value_id); 
          END IF;
       commit;
       END LOOP;
       Close C1;
       END;
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   rs.    7 年前

    您可以避免使用光标,并尝试使用源SQL插入/创建行,下面的SQL查询将为您提供如何在不使用光标的情况下实现这一点的基本概念。

    ex(在op更新问题后编辑,根据组级别处理): 假设(您的原始SQL不完整,并且不清楚哪个字段存储在哪个字段中,哪个字段存储在哪个字段中,哪个字段存储在cursor变量的for value表中)-YYYY存储在value表的日期字段中。

    --create value table rows
    INSERT INTO Value (Value, Date, Color)
    SELECT 
    case 
     when group_level_nb = 2 then total
     when group_level_nb = 3 then maxval
    end, yyyy, color from
    (
        select
          sum(value_nb) total,
          to_char(hr, 'yyyy') yyyy,
          sum(value_nb) total,
          max(value_nb) maxval,
          color
          form_field form_field,
          grouping_id(to_char(hr, 'yyyy'), form_field, color) AS group_level_nb
        from
          value v
          left outer join submission_value_rel sv on v.value_id = sv.value_id
          left outer join submission s on sv.submission_id = s.submission_id
        group by cube (to_char(hr, 'yyyy'), form_field_tx, color)
    ) src
    WHERE group_level_nb IN (2,3);
    
    --create calculation table rows
    INSERT INTO Calculation (year)
    SELECT DISTINCT Date From Value;
    
    --create rel table
    INSERT INTO Calculation_Rel (Calculation_id, Value_Id)
    SELECT B.Calculation_id, A.Value_Id
    FROM Value A
    INNER JOIN Calculation B ON A.Date = B.Year;