2017-07-25 3 views
1

Je commence à travailler avec sql et j'ai fait face à des requêtes hiérarchiques. Pendant ce temps, j'ai réussi à sélectionner les lignes avec connect by prior commande, mais n'a pas réussi à mettre à jour. Voici ma requête de mise à jour:sql syntax pour la requête de mise à jour avec se connecter par avant

update HTABLE set status = 'INACTIVE' 
    WHERE STATUS <> 'CLOSE' 
    Connect by prior PARENT_ID=ID start with PARENT_ID=12345; 

Je SQL Error: ORA-00933: SQL command not properly ended obtenu et sera heureux de savoir comment mettre à jour en utilisant la table .. hiérarchisés

Merci!

EDIT J'ai aussi essayé de mettre la condition where dans le start with, pas aide:

update HTABLE set status = 'INACTIVE' 
    Connect by prior PARENT_ID=ID start with PARENT_ID=12345 AND STATUS <> 'CLOSE'; 

Répondre

2

La requête hiérarchique fonctionne uniquement avec SELECT. Cela ne fonctionne pas avec UPDATE (je suis d'accord que ça pourrait être propre si c'était le cas).

Donc ce que vous pouvez faire est la suivante:

update HTABLE 
set status = 'INACTIVE' 
WHERE STATUS <> 'CLOSE' 
and id in (select c.id 
      from htable 
      connect by prior ID = PARENT_ID 
      start with PARENT_ID = 12345); 

Notez l'ordre des colonnes connect by prior ID = PARENT_ID. Normalement, nous voulons descendre l'arbre de la ligne START WITH, ce que j'ai fait. Votre commande connect by prior PARENT_ID = ID remonte l'arbre de 12345 à ses parents, grands-parents, etc. Si c'est ce que vous voulez, retournez la clause connect by.

1

Vous pouvez mettre à jour en utilisant la clause where id in (select ... connect by...) ou vous pouvez utiliser merge:

merge into htable h 
using (select distinct id 
     from htable 
     where status <> 'CLOSE' 
     connect by prior parent_id = id 
     start with parent_id = 11) src 
on (h.id = src.id) 
when matched then update set status = 'INACTIVE' 

test données:

create table htable (id number(4), parent_id number(4), status varchar2(10)); 
insert into htable values ( 1, null, 'ACTIVE'); 
insert into htable values ( 11, 1, 'CLOSE'); 
insert into htable values ( 12, 1, 'ACTIVE'); 
insert into htable values (111, 11, 'ACTIVE'); 
insert into htable values (112, 11, 'ACTIVE'); 
insert into htable values (121, 12, 'ACTIVE'); 
insert into htable values ( 2, null, 'ACTIVE'); 
insert into htable values ( 21, 2, 'ACTIVE'); 
insert into htable values (211, 21, 'ACTIVE'); 
insert into htable values (212, 21, 'ACTIVE'); 

et après merge:

ID PARENT_ID STATUS 
----- --------- ---------- 
    1   INACTIVE 
    11   1 INACTIVE 
    12   1 ACTIVE 
    111  11 INACTIVE 
    112  11 INACTIVE 
    121  12 ACTIVE 
    2   ACTIVE 
    21   2 ACTIVE 
    211  21 ACTIVE 
    212  21 ACTIVE