2015-01-27 4 views
0

레코드/튜플이 10 개인 테이블이 있다고 가정합니다. 지금은 커서/루프를 사용하지 않고 이동 즉 1 위 기록, 2-7, 3-8, 4-9, 5-10의 동일한 속성을 가진 6 기록의 속성을 업데이트 할. 임의의 수의 임시 테이블 사용이 허용됩니다. 그렇게하는 전략은 무엇입니까?같은 테이블의 다른 튜플과 동일한 속성으로 튜플의 특정 속성을 업데이트 할 수 있습니까? 가능한 경우 알고리즘이 무엇이되어야합니까?

답변

0

PostgreSQL을 (그리고 아마도 다른 RDBMS에서) 당신은 당신이 SELECT 문에서 수 UPDATE 문에 자체 조인 사용하자 :

UPDATE tbl 
SET attr = t2.attr 
FROM tbl t2 
WHERE tbl.id = t2.id + 5 
AND tbl.id >= 6 
0

이 업데이 트-와 조인과 쉬운 것입니다하지만 오라클은 '아무튼 그렇게하면 가장 가까운 대용품은 일하기가 까다로울 수 있습니다. 여기가 가장 쉬운 방법입니다. where 절에 새 값과 상관 된 하위 쿼리를 가져 오는 하위 쿼리가 포함됩니다. 복잡해 보이지만 set 하위 쿼리는 자체적으로 설명해야합니다.

where 하위 쿼리는 정말 단 하나의 목적을 가지고 : 그것은 우리가 가입 할 수있는 경우에 할 것 on 절만큼 두 테이블을 연결합니다. 기본 테이블 (하나가되고, 업데이트)에서 사용되는 필드가 키 필드 여야 제외. 아래에서 수행되는 자체 "조인"과 함께, 그들은 모두 동일한 필드이지만 필요한 것은 사실입니다. 같이

where 절 다른 금지 기준을 추가합니다.

KEYVAL ATTR 
------ ---- 
    1  1 
    2  2 
    3  3 
    4  4 
    5  5 
    6  6 
    7  7 
    8  8 
    9  9 
    10 10 

이 결과 :

create table Tuples(
    KeyVal int not null primary key, 
    Attr int 
); 

insert into Tuples 
    select 1, 1 from dual union all 
    select 2, 2 from dual union all 
    select 3, 3 from dual union all 
    select 4, 4 from dual union all 
    select 5, 5 from dual union all 
    select 6, 6 from dual union all 
    select 7, 7 from dual union all 
    select 8, 8 from dual union all 
    select 9, 9 from dual union all 
    select 10, 10 from dual; 

표는이처럼 보이는 밖으로 시작합니다

update Tuples t1 
    set t1.Attr =(
     select t2.Attr 
     from Tuples t2 
     where t2.Attr = t1.Attr - 5) 
where exists(
     select t2.KeyVal 
     from Tuples t2 
     where t1.KeyVal = t2.KeyVal) 
    and t1.Attr > 5; 

SqlFiddle 데이터가 사용 그래서 여기에 지금 hissy 적합을 당기고 있습니다

KEYVAL ATTR 
------ ---- 
    1  1 
    2  2 
    3  3 
    4  4 
    5  5 
    6  1 
    7  2 
    8  3 
    9  4 
    10  5