2010-05-04 5 views
2

Je travaille à la fonction du livre Joe Celkos - arbres et Hiérarchies dans SQL pour Smartiessyntaxe postgresql en boucle existe

J'essaie de supprimer un sous-arbre à partir d'une liste de contiguïté mais une partie ma fonction n'est pas fonctionne encore.

WHILE EXISTS –– mark leaf nodes 
    (SELECT * 
     FROM OrgChart 
    WHERE boss_emp_nbr = −99999 
     AND emp_nbr > −99999) 
    LOOP –– get list of next level subordinates 
    DELETE FROM WorkingTable; 
    INSERT INTO WorkingTable 
    SELECT emp_nbr FROM OrgChart WHERE boss_emp_nbr = −99999; 
    –– mark next level of subordinates 
    UPDATE OrgChart 
     SET emp_nbr = −99999 
     WHERE boss_emp_nbr IN (SELECT emp_nbr FROM WorkingTable); 
END LOOP; 

ma question: est le PENDANT QUE EXISTE correct pour une utilisation avec/postgresql? Je semble trébucher et se faire prendre dans une boucle infinie dans cette partie. Peut-être y a-t-il une syntaxe plus correcte que je ne connais pas.

Répondre

0

Étant donné que WHILE accepte l'expression booléenne et la transmet au moteur SQL, la question est de savoir s'il s'agit d'une instruction SELECT valide. Il semble que ce devrait être, mais juste au cas où vous pourriez vouloir reformuler la condition à quelque chose comme ceci:

WHILE (SELECT count(*) FROM OrgChart WHERE boss_emp_nbr=09999 AND emp_nbr > -99999) > 0 LOOP 

Spontanément, la boucle sans fin pourrait avoir plus à faire la mise à jour OrgChart, mais pour que ce serait aider un peu à avoir la structure de la table et une explication de ce que vous essayez de faire exactement.

1

L'utilisation de WHILE EXISTS (...) est correcte, car EXISTS (...) est un opérateur booléen SQL.

Il est difficile de voir ce que vous essayez réellement de faire (ce ne serait pas mieux fait comme une requête récursive), mais je pense que votre logique est fausse: par exemple, une table contenant une seule ligne avec (emp_nbr = 1, boss_emp_nbr = -99999) provoquera une boucle infinie car il essaye continuellement de mettre à jour tous les enregistrements où (boss_emp_nbr dans (1)) pour avoir emp_nbr = -99999 (sans effet).

Questions connexes