2013-08-09 4 views
-2

Je dois mettre à jour une colonne person_id dans une table basée sur l'autre colonne family_id. Plusieurs enregistrements peuvent contenir pour chaque ID de famille. Je veux définir person_id valeurs commençant par 1 et incrémenter de 1 pour chaque famille.Requête unique pour mettre à jour des enregistrements avec des valeurs de colonne basées sur des valeurs différentes dans Oracle

Y a-t-il une requête unique à faire? ou je peux avoir une boucle pour les familles et définir les valeurs? En utilisant Oracle 10g et je dois fournir cette logique dans un paquet.

+0

Montrez-nous les tables définitions et qu'avez-vous essayé , S'il vous plaît. –

+0

s'il vous plaît fournir les détails de la table – Harshit

+0

détails du tableau? Quels détails de table attendez-vous? Une table avec deux champs entiers à savoir 'family_id' et 'person_id'. Et j'ai besoin de réinitialiser les valeurs person_id basées sur family_id. Est-ce assez? – hemanth

Répondre

2

Here is the SQLFiddel Demo

est inférieure à la requête Mise à jour

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

Je pense que je l'ai. Voici mon exemple simple:

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); 

Le tableau est:

person_id family_id 
10   1 
11   1 
12   1 
20   2 
21   2 

La fonction row_number nous permettra de réindexer, comme la déclaration suivante montre:

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 

Maintenant, nous "juste" devoir mettre à jour la table grâce à cette nouvelle colonne 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 
) 
; 

Nous avons alors ce que je pense que vous voulez:

person_id family_id 
1   1 
2   1 
3   1 
1   2 
2   2 
+0

Solution nécessaire dans 'oracle'. votre message est bon mais c'est dans 'SQL Server' – Romesh

+1

Je ne pense pas, puisque j'ai testé ma solution sous Oracle 11g :-) – Emmanuel

Questions connexes