2013-08-09 5 views
-2

Мне нужно обновить столбец person_id в таблице на основе другого столбца family_id. Несколько записей могут содержать для каждого идентификатора семейства. Я хочу установить значения person_id, начиная с 1 и увеличивая на 1 для каждой семьи.Одиночный запрос для обновления записей с разными значениями значения столбца на основе значения в oracle

Есть ли какой-либо запрос для этого? или я могу иметь некоторый цикл для семейств и установить значения? Использование Oracle 10g и мне нужно предоставить эту логику в пакете.

+0

Покажите нам определения таблиц и то, что вы пробовали , пожалуйста. –

+0

, пожалуйста, предоставьте таблицу подробности – Harshit

+0

таблица подробности? какую таблицу вы ожидаете? Таблица с двумя целыми полями: «family_id» и «person_id». И мне нужно сбросить значения person_id на основе family_id. Этого достаточно? – hemanth

ответ

2

Here is the SQLFiddel Demo

Ниже приводится запрос обновления

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) 
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 
+0

Решение, необходимое для «oracle». ваш пост хорош, но его в SQL Server – Romesh

+1

Я так не думаю, так как я тестировал свое решение под Oracle 11g :-) – Emmanuel

Смежные вопросы