2010-05-04 33 views
2

我在功能工作從喬Celkos書 - 樹木和層次結構在SQL爲Smarties一PostgreSQL的語法,同時存在循環

我試圖從鄰接表,但部分刪除子樹我的功能是不工作尚未。

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

由於WHILE接受布爾表達式並將其提供給SQL引擎,問題是這是否是有效的SELECT語句。現在看來,這是應該的,但以防萬一,你可能希望改寫的條件是這樣的:

WHILE (SELECT count(*) FROM OrgChart WHERE boss_emp_nbr=09999 AND emp_nbr > -99999) > 0 LOOP 

隨口說說的,無休止的循環可能有更多的是與組織結構圖更新,但它會幫助瞭解一下表格結構並解釋你到底想要做什麼。

1

使用WHILE EXISTS (...)是好的,因爲EXISTS (...)是一個布爾SQL運算符。

很難看出你實際想要做什麼(作爲遞歸查詢,這樣做不會更好),但我認爲你的邏輯是錯誤的:例如,一個包含單行的表(emp_nbr = 1,boss_emp_nbr = -99999)將導致無限循環,因爲它不斷嘗試更新((1)中的boss_emp_nbr)具有emp_nbr = -99999(無效)的所有記錄。