Мой модуль 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; @ *; }
Это должно работать (работает для меня)
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
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)
Но это будет не очень быстро, и, как указал Дэмиен, вы должны повторно запускать это утверждение каждый раз, когда вы меняете данные в этой таблице.
Небольшая коррекция просто добавляет 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)
Сначала создайте последовательность:
CREATE SEQUENCE SEQ_SLNO START с 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE NOCACHE NOORDER;
после этого Обновите таблицу, используя последовательность:
UPDATE имя_таблицы SET colun_name = SEQ_SLNO.NEXTVAL;
ORA-30483: функции окна здесь не разрешены
, когда я использую его в предложенииSET
& gt; __ & lt; .. – Lukman 23 May 2011 в 08:23MERGE
– Lukas Eder 23 May 2011 в 08:43