postgresql语法存在循环时

yzuktlbb  于 2023-02-15  发布在  PostgreSQL
关注(0)|答案(2)|浏览(171)

我正在研究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**对于使用w/postgresql是正确的吗?2在这一部分我似乎被绊倒并陷入了无限循环。3也许有一个更正确的语法我不知道。

jvidinwx

jvidinwx1#

使用WHILE EXISTS (...)就可以了,因为EXISTS (...)是一个布尔SQL操作符。
很难看出您实际上想做什么(这不是递归查询更好的做法),但我认为您的逻辑是错误的:例如,当一个表包含具有(emp_nbr= 1,boss_emp_nbr =-99999)的单行时,它将导致无限循环,因为它不断地尝试更新其中((1)中的boss_emp_nbr)的所有记录以具有emp_nbr=-99999(没有效果)。

km0tfn4u

km0tfn4u2#

由于WHILE接受布尔表达式并将其提供给SQL引擎,因此问题是这是否是一个有效的SELECT语句。看起来应该是,但为了以防万一,您可能希望将条件改写为如下形式:

WHILE (SELECT count(*) 
           FROM OrgChart 
           WHERE boss_emp_nbr=09999 AND emp_nbr > -99999
      ) > 0
LOOP
     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;

顺便说一下,无限循环可能与OrgChart UPDATE有更多的关系,但对于这一点来说,拥有表结构和对您到底要做什么的解释会有所帮助。

相关问题