2013-10-07 3 views
0

동일한 테이블의 다른 필드 인 entity_id를 참조하여 varchar2 필드를 순차 값 (예 : 001, 002, 002)으로 업데이트해야합니다. 예를 들어 두 개의 다른 행에 동일한 entity_id가있는 경우 순차 값이 동일해야합니다.동일한 테이블의 다른 필드를 참조하여 테이블의 한 필드 업데이트

예 출력 :

Entity_id  Seq_field 
1234   001 
1234   001 
4567   002 
4567   002 
3412   003 

나는 ROWNUM과 시도했지만 각 ENTITY_ID에 대해 다른 값을 제공하고 물론 값이 후행 제로가 없습니다. 도와주세요.

답변

3
merge into the_table 
using 
(
    select rowid as rid, 
     entity_id, 
     to_char(dense_rank() over (order by entity_id), 'FM00000') as seq 
    from foo 
) t on (the_table.rowid = t.rid) 
when matched 
    then update set seq_field = t.seq; 

당신은 당신이 약간 문을 변경해야하는 각 entity_id에 대한 새로운 시퀀스 시작하려면 : 나는 row_number() 대신 dense_rank()partition by entity_id을 사용

merge into foo 
using 
(
    select rowid as rid, 
     entity_id, 
     to_char(row_number() over (partition by entity_id order by null), 'FM00000') as seq 
    from foo 
) t on (foo.rowid = t.rid) 
when matched 
    then update set seq_field = t.seq; 

참고 각각의 새와 번호 매기기를 다시 시작을 entity_id의 값입니다. 하나의 entity_id에 대한 '주문'을 결정하는 다른 열이 있다면 order by nullnull을 해당 열로 바꿀 수 있습니다. order by created_at

+0

올바른 내용입니다. 엔티티 ID가 변경 될 때 번호가 다시 001, 002, 003 ...과 같이 반복되도록 각 엔티티 ID에 대해 001, 002를 업데이트하려는 경우 어떻게해야합니까? – ErrorNotFoundException

+1

@ Stanley : 내 편집 참조 –

+0

감사합니다. 아주 많이 감사합니다. – ErrorNotFoundException

1

몇 개의 레코드가 있습니까? 아래는 내가 생각해 낸 해결책이지만 대규모 데이터 세트에서는 제대로 작동하지 않습니다. SQLFiddle에서

CREATE TABLE tab (entity_id NUMBER, seq_field VARCHAR2(3)); 

INSERT INTO tab VALUES (1234, NULL); 
INSERT INTO tab VALUES (1234, NULL); 
INSERT INTO tab VALUES (4567, NULL); 
INSERT INTO tab VALUES (4567, NULL); 
INSERT INTO tab VALUES (3412, NULL); 

UPDATE tab t SET seq_field = (
    SELECT LPAD(rnk, 3, '0') 
    FROM (
     SELECT entity_id, seq_field, DENSE_RANK() OVER (ORDER BY entity_id) AS rnk 
     FROM tab 
    ) t2 
    WHERE t2.entity_id = t.entity_id AND rownum = 1 
); 

확인 : http://sqlfiddle.com/#!4/3959d/1

, 귀하의 질문에 모두 SQLORACLE 태그를 추가 고려하면 더 많은 관심과 아마도 더 나은 솔루션을 얻을 것 같아요.

관련 문제