2013-01-17 2 views
0

그룹 결과에 따라 테이블 업데이트그룹 결과에 따라 테이블 업데이트

해결하기 위해 노력하고있는 까다로운 업데이트 문제가 있습니다. 필드의

Table1 {pers_id, loc_id, pos, ... }

Table2 {pers_id, loc_id, pos, ... }

없음 독특한 없습니다 :이처럼 보이는 같은 세 개의 열 및 추가 다양한 열을 포함하는 두 개의 테이블이 있습니다. 처음 두 필드는 동일한 엔티티에 속한 테이블 (또는 테이블)의 레코드를 집합 적으로 식별합니다. Table1은 엔터티에 속한 15 개의 레코드를 가질 수 있으며 table2는 동일한 엔터티에 속한 4 개의 레코드를 가질 수 있습니다. 세 번째 컬럼 'pos'는 0에서부터 어떤 인덱스까지이며, 이것은 업데이트하려고하는 컬럼입니다.

표 1과 표 2에서 pos 열은 0에서 시작하여 사용자 선택에 따라 증가하기 때문에 예제 (table1의 15 개 레코드와 table2의 4 개 레코드)는 table1에 0 - 14, Table2는 0-3의 'pos'값을 포함합니다.

Table1의 pos 필드를 Table2에서 유사한 엔티티 수의 결과로 증가시키고 싶습니다.

select table2.pers_id, table2.loc_id, count(*) as pos_increment from table2 group by table2.pers_id, table2.loc_id;

예에서, 업데이트의 최종 결과는 (표 15 개 기록과 표 2 사 개 기록), 모든 기록 될이 제대로 나에게 표 2의 결과를 제공하는 SQL 문이다 동일한 엔티티의 Table1이 4만큼 증가합니다 (특정 엔티티 그룹 by의 결과). 0은 4, 15에서 19 등으로 변경됩니다.

단일 성명에서 성취 할 수 있습니까?

답변

0

네, 가능합니다. 일부 업다에 MERGE를 사용할 수 있으며 업데이트와 하위 선택 사이의 값을 연결하는 방법이 있습니다. 나는 이것을 과거에 해왔지만, 까다 롭고 기존의 예가 없다.

이 사이트에서 약간의 예제를 찾을 수 있습니다. 일부는 Oracle 용이고 다른 일부는 약간 수정 한 것입니다. 당신은 단지 pos 필드를 증가 할 필요가 있기 때문에

1

이 솔루션은 정말 간단하다 : [여기]

update table1 t1 
set t1.pos = t1.pos + 
    (select count(1) 
    from table2 t2 
    where t2.pers_id = t1.pers_id 
    and t2.loc_id = t1.loc_id) 
+1

그냥 그것에 나를 이길, 데모 (http://www.sqlfiddle.com/#!4/ ac2b4/1) – GarethD

+0

완벽 - 매력처럼 작동합니다. 감사. – bill89654

+0

대답을 수락 된 것으로 표시하십시오. 감사. –

관련 문제