我正在研究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也许有一个更正确的语法我不知道。
2条答案
按热度按时间jvidinwx1#
使用
WHILE EXISTS (...)
就可以了,因为EXISTS (...)
是一个布尔SQL操作符。很难看出您实际上想做什么(这不是递归查询更好的做法),但我认为您的逻辑是错误的:例如,当一个表包含具有(emp_nbr= 1,boss_emp_nbr =-99999)的单行时,它将导致无限循环,因为它不断地尝试更新其中((1)中的boss_emp_nbr)的所有记录以具有emp_nbr=-99999(没有效果)。
km0tfn4u2#
由于WHILE接受布尔表达式并将其提供给SQL引擎,因此问题是这是否是一个有效的SELECT语句。看起来应该是,但为了以防万一,您可能希望将条件改写为如下形式:
顺便说一下,无限循环可能与OrgChart UPDATE有更多的关系,但对于这一点来说,拥有表结构和对您到底要做什么的解释会有所帮助。