Есть ли способ вставить данные в столбец oracle sql, где сгенерированные строки основаны на минимальных и максимальных данных - PullRequest
1 голос
/ 08 января 2020

Например, у меня есть таблица TABLE_A со столбцами COLUMN_A и COLUMN_B. COLUMN_A имеет «Номер тела» в качестве данных, а COLUMN_B пуст, но имеет тип данных числа. Я хотел бы обновить или вставить в TABLE_A для заполнения COLUMN_B значениями диапазона, начинающимися с 68900000 и заканчивающимися до 68999005, где COLUMN_A = 'Body Number'. Таким образом, строки, которые я ожидаю вставить в COLUMN_B, составляют 899 005 строк.

Ответы [ 4 ]

2 голосов
/ 08 января 2020

Я бы сделал это с помощью последовательности:

Допустим, это ваша таблица:

create table Table_A (columnA varchar2(100), columnB number);

Создайте последовательность следующим образом:

create sequence testS 
  MINVALUE 68900000
  MAXVALUE 68999005
  START WITH 68900000
  INCREMENT BY 1;

И обновите свой Таблица, подобная этой:

update Table_A
set columnB = testS.nextval
where columnA = 'Body Number';

Вот небольшая DEMO

Если вы получаете сообщение об ошибке типа «TESTS.NEXTVAL превышает MAXVALUE и не могут быть созданы ... "тогда вы сначала отбросите последовательность следующим образом:

drop sequence testS;

, а затем создадите новую последовательность с новыми значениями MINVAL или MAXVAL или обоими. Например:

create sequence testS 
  MINVALUE 68800000
  MAXVALUE 68999005
  START WITH 68800000
  INCREMENT BY 1;

Я изменил MINVAL с 68900000 на 68800000, и таким образом я позволил последовательности генерировать еще 100000 новых чисел, начиная с 68800000, а не с 68900000. В этом случае я также изменяю START Со значением до 68800000.

2 голосов
/ 08 января 2020

Это INSERT, я полагаю, если у вас уже нет такого количества строк в таблице.

Кстати, вы ожидаете слишком много строк; разница между этими двумя числами не 899,005.

SQL> create table table_a (column_a varchar2(20), column_b number);

Table created.

SQL> insert into table_a (column_a, column_b)
  2  select 'Body Number', 68900000 + level - 1 column_b
  3  from dual
  4  connect by level <= 68999005 - 68900000 + 1;

99006 rows created.

SQL> select min(column_b), max(column_b) from table_a;

MIN(COLUMN_B) MAX(COLUMN_B)
------------- -------------
     68900000      68999005

SQL>
0 голосов
/ 08 января 2020

Мне кажется, это сработает

update table_a
   set column_b = (68900000 - 1) + rownum
 where column_a = 'Body number'
   and (68900000 - 1) + rownum < 68999005;

И, как упоминал Littlefoot, разница между 68900000 и 68999005 составляет всего 99005, а не 899005

0 голосов
/ 08 января 2020

Если COLUMN_A уже содержит данные как 'Body Number' в вашем TABLE_A, вы можете обновить эти строки с помощью analytical function, чтобы установить COLUMN_B следующим образом:

UPDATE TABLE_A
SET
    COLUMN_B = CASE
                WHEN rownum  <= 899005 
                THEN rownum  + 68900000 - 1
               END
WHERE
    COLUMN_A = 'Body Number';

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...