Oracle: UPDATE с ORDER BY [duplicate]

Мой модуль Set :: CrossProduct выполняет именно то, что вы хотите. Обратите внимание, что вы действительно не ищете перестановки, которые являются упорядочением элементов в наборе. Вы ищете кросс-продукт, который представляет собой комбинацию элементов из разных наборов.

Мой модуль дает вам итератор, поэтому вы не создаете его в памяти. Вы создаете новый кортеж только тогда, когда вам это нужно.

  использовать Set :: Crossproduct;  my $ iterator = Set :: CrossProduct- & gt; new ([[qw (foo bar baz)], [qw (cat dog)], [qw (1 2 3 4)],]);  while (my $ tuple = $ iterator- & gt; get) {say join '', $ tuple- & gt; @ *;  }  

16
задан Lukman 23 May 2011 в 08:18
поделиться

4 ответа

Это должно работать (работает для меня)

  update table_a external set sequence_column = (выберите rnum from (- оцените row_number () для всех строк, упорядоченных вашими столбцами - ПЕРЕД обновлением этих  значения в table_a выберите id, row_number () over (order by column1, column2) rnum from table_a) internal - присоединитесь к первичному ключу, чтобы убедиться, что вы получите только одно значение - для rnum, где inner.id = внешний.  Я бы);   

ИЛИ вы используете оператор MERGE . Что-то вроде этого.

  сливается в table_a u, используя (select id, row_number () over (order by column1, column2) rnum from table_a) s on (u.id = s.id), когда  затем установлен набор обновлений u.sequence_column = s.rnum  
27
ответ дан Lukas Eder 15 August 2018 в 22:39
поделиться
  • 1
    Oracle возвращает ошибку: ORA-30483: функции окна здесь не разрешены , когда я использую его в предложении SET & gt; __ & lt; .. – Lukman 23 May 2011 в 08:23
  • 2
    См. Мое обновление. Я попробовал это с более простой таблицей. Это даст вам представление о решении вашей ситуации – Lukas Eder 23 May 2011 в 08:31
  • 3
    Я выполнил это заявление, и он все еще работает прямо сейчас, почти 5 минут. В таблице всего около 15 тыс. Записей, хотя медленность странная. – Lukman 23 May 2011 в 08:40
  • 4
    Да, это работает! Благодаря! – Lukman 23 May 2011 в 08:43
  • 5
    @Lukman, нет, я бы сказал, что это вполне ожидаемо, если учесть тот факт, что всю таблицу нужно сортировать, row_number () оценивается для каждой отдельной записи ... Что бы вы могли попробовать, однако это утверждение MERGE – Lukas Eder 23 May 2011 в 08:43
  UPDATE table_a SET sequence_column = (выберите rn from (выберите rowid, row_number () over (order by col1, col2) from table_a) x где x.rowid = table_a.rowid)  

Но это будет не очень быстро, и, как указал Дэмиен, вы должны повторно запускать это утверждение каждый раз, когда вы меняете данные в этой таблице.

2
ответ дан a_horse_with_no_name 15 August 2018 в 22:39
поделиться

Небольшая коррекция просто добавляет AS RN:

  UPDATE table_a SET sequence_column = (выберите rn from (выберите rowid, row_number () over (order by col1, col2) AS RN из table_a)  x, где x.rowid = table_a.rowid)  
1
ответ дан Gytis Tenovimas 15 August 2018 в 22:39
поделиться

Сначала создайте последовательность:

  CREATE SEQUENCE SEQ_SLNO START с 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE NOCACHE NOORDER;   

после этого Обновите таблицу, используя последовательность:

  UPDATE имя_таблицы SET colun_name = SEQ_SLNO.NEXTVAL;   
2
ответ дан The Dictator 15 August 2018 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: