[SQL] 오라클 : ORDER BY 절과 함께 ROWNUM을 사용하여 테이블 열을 업데이트
SQL오라클 : ORDER BY 절과 함께 ROWNUM을 사용하여 테이블 열을 업데이트
나는 그래서 ROWNUM을 사용하여 생각하고, 실행중인 정수와 테이블 열을 채우는합니다. 그러나, 나는 다른 컬럼, ORDER BY의 1 열, 2 열 같은의 순서에 따라 그것을 채울 필요가있다. 오라클은 다음과 같은 성명을 허용하지 않기 때문에 즉, 불행하게도, 수 없습니다 :
UPDATE table_a SET sequence_column = rownum ORDER BY column1, column2;
도 아니다 다음 문장 (절과 함께 사용하기 위해) :
WITH tmp AS (SELECT * FROM table_a ORDER BY column1, column2)
UPDATE tmp SET sequence_column = rownum;
그래서 어떻게 그것이 SQL 문을 사용하여 PL / SQL에서 반복 방법을 커서에 의지하지 않고합니까?
해결법
-
==============================
1.이 작동합니다 (나를 위해 작품)
이 작동합니다 (나를 위해 작품)
update table_a outer set sequence_column = ( select rnum from ( -- evaluate row_number() for all rows ordered by your columns -- BEFORE updating those values into table_a select id, row_number() over (order by column1, column2) rnum from table_a) inner -- join on the primary key to be sure you'll only get one value -- for rnum where inner.id = outer.id);
또는 당신은 MERGE 문을 사용합니다. 이 같은.
merge into table_a u using ( select id, row_number() over (order by column1, column2) rnum from table_a ) s on (u.id = s.id) when matched then update set u.sequence_column = s.rnum
-
==============================
2.
UPDATE table_a SET sequence_column = (select rn from ( select rowid, row_number() over (order by col1, col2) from table_a ) x where x.rowid = table_a.rowid)
그러나 그것은 매우 빠르지 않을 것이며, 데미안가 지적했듯이, 당신은 다시 실행이 사항에 해당 테이블의 데이터를 변경할 때마다이있다.
-
==============================
3.첫 번째 시퀀스를 만들기 :
첫 번째 시퀀스를 만들기 :
CREATE SEQUENCE SEQ_SLNO START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE NOCACHE NOORDER;
순서를 사용하여 해당 업데이트 테이블 후 :
UPDATE table_name SET colun_name = SEQ_SLNO.NEXTVAL;
-
==============================
4.작은 보정 마찬가지로 RN 추가 :
작은 보정 마찬가지로 RN 추가 :
UPDATE table_a SET sequence_column = (select rn from ( select rowid, row_number() over (order by col1, col2) AS RN from table_a ) x where x.rowid = table_a.rowid)
from https://stackoverflow.com/questions/6094039/oracle-updating-a-table-column-using-rownum-in-conjunction-with-order-by-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은 - 어떻게 다음 행에서 이전 행과 가치의 가치를 얻을? [복제] (0) | 2020.05.24 |
---|---|
[SQL] MySQL의에서 주말과 공휴일을 제외한 날짜 차이를 계산하는 방법 (0) | 2020.05.24 |
[SQL] 어떻게 3360에 3306에서 MySQL의 기본 포트를 변경하려면 (0) | 2020.05.24 |
[SQL] C #에서 호출 SQL 정의 기능 (0) | 2020.05.24 |
[SQL] 나는 MS Access에서 SQL INTERSECT 및 MINUS 연산을 구현할 수있는 방법 (0) | 2020.05.24 |