-2

person_id他の列に基づいてテーブルの列を更新する必要がありますfamily_id。各家族 ID に対して複数のレコードを含めることができます。person_id値を 1 から設定し、ファミリごとに 1 ずつ増やしたいと考えています。

そうするための単一のクエリはありますか?または、ファミリのループを作成して値を設定できますか? Oracle 10g を使用しており、このロジックをパッケージで提供する必要があります。

4

2 に答える 2

3

私はそれを持っていると思います。これが私の簡単な例です:

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
于 2013-08-09T13:24:03.360 に答える
2

ここにSQLFiddelのデモがあります

以下は更新クエリです

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)
于 2013-08-09T13:36:51.880 に答える