我在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/