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