我正在使用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?我似乎磕磕绊绊,陷入了这一部分的无限循环中。也许我没有意识到更正确的语法。
答案 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有更多关系,但为此,它有助于获得表结构并解释你究竟想要做什么。