存在循环时的postgresql语法

存在循环时的postgresql语法,sql,database,postgresql,function,Sql,Database,Postgresql,Function,我正在处理Joe Celkos的书中的函数-Smarties SQL中的树和层次结构 我正试图从邻接列表中删除子树,但我的函数的一部分还没有工作 WHILE EXISTS –– mark leaf nodes (SELECT * FROM OrgChart WHERE boss_emp_nbr = −99999 AND emp_nbr > −99999) LOOP –– get list of next level subordinates

我正在处理Joe Celkos的书中的函数-Smarties SQL中的树和层次结构

我正试图从邻接列表中删除子树,但我的函数的一部分还没有工作

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;

我的问题是:WHILE EXISTS是否适合使用postgresql?在这一部分中,我似乎跌跌撞撞,陷入了无限循环。也许我不知道还有一种更正确的语法。

因为虽然接受布尔表达式并将其提供给SQL引擎,但问题是这是否是有效的SELECT语句。看起来应该是这样的,但为了以防万一,您可能希望将条件重新表述为以下内容:

WHILE (SELECT count(*) FROM OrgChart WHERE boss_emp_nbr=09999 AND emp_nbr > -99999) > 0 LOOP
顺便说一句,无休止的循环可能与OrgChart更新有更多的关系,但是对于这一点,有一个表结构和解释您到底想做什么会有帮助。

使用
WHILE EXISTS(…)
很好,因为
EXISTS(…)
是一个布尔SQL运算符

很难看出您实际上在尝试做什么(作为递归查询,这样做不会更好),但我认为您的逻辑是错误的:例如,一个表包含一行(emp_nbr=1,boss_emp_nbr=-99999),这将导致一个无限循环,因为它不断尝试更新所有记录,其中(boss_emp_nbr in(1))的emp_nbr=-99999(没有效果)