Как сделать так, чтобы запись отображалась в таблице 1 для каждого года, а затем автоматически сопоставляли вычисленные значения во второй таблице? - PullRequest
0 голосов
/ 25 сентября 2018

Итак, я вычисляю / собираю кучу данных, используя GROUPING_ID, и пытаюсь

1) получить запись в таблице CALCULATION , созданной для каждого отдельного ГОДА и

2) вставить вычисленное значение VALUE, соотнесенное с этим годом, как связанное в таблице отношений CALCULATION_REL и

3) вставить вычисленное значение в таблицу VALUE (эта часть довольнопросто)

Итак, по сути, ниже мой курсор, который я использую для получения данных:

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_Rel (таблица)

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

Лучшее, что я могу придумать, - это создать два отдельных курсора, открыть один для вставки в таблицу CALCULATION и затем закрыть его.Открываем второй курсор для вставки в VALUE и Calculation_Rel и затем каким-то образом связываем его вместе.Или циклически проходя по одному курсору и создавая для каждого отношения вычисления / значения значение calc_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 Ответ

0 голосов
/ 25 сентября 2018

Вы можете избегать курсоров и пытаться вставлять / создавать строки, используя исходный SQL. Приведенные ниже SQL-запросы должны дать вам базовое представление о том, как этого добиться без курсоров.

Ex (Отредактировано после того, как OP обновил вопрос для обработкина основе group_level_nb): Предполагается (ваш исходный SQL неполный и неясно, в каком поле хранится поле для таблицы значений из переменной курсора) - YYYY сохраняется в поле даты таблицы значений.

--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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...