person_id
他の列に基づいてテーブルの列を更新する必要がありますfamily_id
。各家族 ID に対して複数のレコードを含めることができます。person_id
値を 1 から設定し、ファミリごとに 1 ずつ増やしたいと考えています。
そうするための単一のクエリはありますか?または、ファミリのループを作成して値を設定できますか? Oracle 10g を使用しており、このロジックをパッケージで提供する必要があります。
私はそれを持っていると思います。これが私の簡単な例です:
create table test_epn
(
person_id number,
family_id number
);
insert into test_epn values(10, 1);
insert into test_epn values(11, 1);
insert into test_epn values(12, 1);
insert into test_epn values(20, 2);
insert into test_epn values(21, 2);
表は次のとおりです。
person_id family_id
10 1
11 1
12 1
20 2
21 2
次のステートメントが示すように、この関数row_number
を使用すると、インデックスを再作成できます。
select e.*, row_number() over
(partition by e.family_id order by e.person_id) new_person_id
from test_epn e;
person_id family_id new_person_id
10 1 1
11 1 2
12 1 3
20 2 1
21 2 2
この新しい列のおかげで、テーブルを「ただ」更新する必要がありますnew_person_id
。
update test_epn e
set e.person_id = (
with w as
(
select f.person_id, f.family_id, row_number()
over (partition by f.family_id order by f.person_id) new_person_id
from test_epn f
)
select w.new_person_id
from w
where w.person_id = e.person_id
)
;
次に、あなたが欲しいと思うものがあります:
person_id family_id
1 1
2 1
3 1
1 2
2 2
以下は更新クエリです
Update Temp
set col1 = (select T3.myrank
from Temp T1,(select T2.id,rank()
over (partition by
T2.family_id
order by T2.id) as myrank
from Temp T2) T3
where t1.id = T3.id
and t1.id = Temp.id)