我在Joe Celkos Book的函数中工作-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的存在是否适合使用postgresql?在这一部分中,我似乎跌跌撞撞,陷入了无限循环。也许有一个更正确的语法我不知道。

最佳答案

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

关于sql - 存在循环时的PostgreSQL语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2767429/

10-14 14:44