存在循环时的postgresql语法

时间:2010-05-04 17:18:05

标签: sql database postgresql function

我正在使用Joe Celkos的函数 - 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 是否正确使用w / postgresql?我似乎磕磕绊绊,陷入了这一部分的无限循环中。也许我没有意识到更正确的语法。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

由于WHILE接受boolean-expression并将其提供给SQL引擎,因此问题是这是否是一个有效的SELECT语句。它似乎应该是,但万一你可能希望将条件重新改写为:

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

另外,无限循环可能与OrgChart UPDATE有更多关系,但为此,它有助于获得表结构并解释你究竟想要做什么。