Пропустить обновление таблицы при отсутствии записей - SQL - PullRequest
0 голосов
/ 13 апреля 2020

введите описание изображения здесь Я хочу перенести данные из старой таблицы (table_old) в новую таблицу (table_new).

table_old имеет следующие столбцы.

  • recordseq
  • начальная дата
  • конечная дата
  • поле1
  • поле2
  • поле3
  • recordnum

table_new имеет следующие столбцы.

  • recordseq
  • startdate
  • enddate
  • field1
  • field2
  • field3
  • field4
  • field5
  • field6
  • recordnum
  • recordnum_old

Каждая recordseq может иметь несколько записей, которые могут быть recordnum например:
Если для определенного recordseq имеется две записи, то в столбцах данных recordnum будут присутствовать 1 и 2.

Требование при переносе данных, каждые две записи в старой таблице должны отображаться в 1 записи.

Здесь миграция данных означает field1, field2, field3 и recordnum.

Например, если В конкретном seq есть 4 записи в старой таблице, тогда первая запись будет вставлена ​​в 1-ю строку новой таблицы в field1, field2, field3, а данные 2-й строки будут вставлены в field4, field5 и field6.

Аналогично для 3-й строки данные в старой таблице будут вставлены во 2-й ряд новой таблицы в field1, field2 и field3, а данные 4-й строки будут b Вставлен в field4, field5 и field6 2-й строки в новой таблице.

Некоторые записи записей могут иметь только одну запись. У разных последовательностей могут быть разные номера записей.

В новой таблице recordnum _old будет содержать данные столбца recordnum старой таблицы, а recordnum будет содержать новый номер записи после миграции.

Поэтому при первой миграции мы вставили recordseq, startdate, enddate и recordnum _old data И recordnum будут постоянными числами, такими как 999, которые позже будут обновлены до фактического номера записи. После этого мы написали приведенный ниже код для переноса оставшихся данных: field1, field2, field3, как описано выше.

    Do
    Begin 
     DECLARE MAX_REC INT;
     DECLARE REC_IDX  INT;

     Select max(recordnum) into MAX_REC FROM table _old;
     MAX_REC := 0;
     REC_IDX:=0;


     while(REC_IDX<= MAX_REC)
     Do
      Begin
      IF(mod(REC_IDX,2)=0) 
       Then

         Update table_new a set (a. recordNum,a.field1,a.field2,a.field3)
         = (select cast(REC_IDX/2 as int),b. field1,b.field2,b.field3 from table_old  b Where 
         a.recordseq=b.recordseq and a.startdate=b.startdate and a.enddate = b.enddate and 
         b.recordnum=REC_IDX)  from table_new a where a.recordnum_old= cast(REC_IDX/2 as int);

      ELSEIF
      THEN
        Update table_new a set (a. recordNum,a.field4,a.field5,a.field6)
        = (select cast(REC_IDX/2 as int),b. field1,b.field2,b.field3 from table_old  b Where 
        a.recordseq=b.recordseq and a.startdate=b.startdate and a.enddate = b.enddate and 
        b.recordnum=REC_IDX)  from table_new a where a.recordnum_old= cast(REC_IDX/2 as int);

     END IF

после завершения выполнения новые записи могут быть отфильтрованы путем проверки записей, которые не имеют pagenum 999

Основная проблема с этим кодом заключается в том, что определенный seq имеет только одну запись, а максимальное количество записей в старой таблице равно 5. На первой итерации первая строка старой записи вставляется в первую строку новой таблицы с номером строки, равным 1, а затем нулевым значение переопределяется для recordnum во 2-й итерации, так как для этой записи больше нет записей seq.

Поэтому я не хочу обновлять новую таблицу для seq, у которого больше нет записей в старой таблице при итерации пока l oop.

Не могли бы вы помочь мне достичь этого.

...