2014-10-20 66 views
2

我瞭解Oracle何時會發生循環。從理論上說,如果一條記錄既是父節點又是另一個節點,同時又是它的孩子,那麼它可以進入一個循環。Oracle:通過用戶數據中的循環連接

但我不明白爲什麼我這個特定的查詢運行到一個循環。

SELECT Empno, Ename, Job 
FROM Emp 
START WITH Empno = 7839 
CONNECT BY PRIOR 
Job='PRESIDENT' 

有人可以請解釋我如何將這些數據導致循環。 我做了CONNECT_BY_ISCYCLE檢查,發現記錄循環是KING(總統)。 但是我仍然不明白怎麼可能,因爲KING是總統,而且我也沒有看到任何方式使它成爲表中任何記錄的孩子和父母。

請解釋一下,爲什麼這是一個錯誤,循環在哪裏?

在此先感謝。

僅供參考,該表是Oracle中SCOTT用戶的默認EMP表。

回答

5

要找到一個父行的孩子,甲骨文評估CONNECT事先 表達的條件父行和 其他表達式,爲在表的每一行。 條件爲真的行是父級的子級。 CONNECT BY 條件可以包含其他條件以進一步過濾由查詢選擇的行 。

如果CONNECT BY條件導致層次結構中出現循環,則返回 Oracle返回錯誤。如果一行是父行 (或祖父母或直屬祖先)和另一行的子女(或孫子或 直接後代),則會發生循環。

如果沒有行滿足START WITH和具有工作=「總統」不會發生環路(甲骨文只檢索START WITH行)

如果在滿足START表中的行

WITH並具有Job ='PRESIDENT'循環出現在任何情況下,因爲:
1. Oracle查找所有滿足START WITH(根行)的行。
2.對於p.1中的每一行,Oracle都會掃描整個表中的後代。所有行(包括從對行1)滿足在CONNECT BY條件(因爲先前工作=「總統」總是爲真)
3.明顯...

+0

嗨Multisync,我理解這個理論。我不明白的是,即使我有一行Job ='PRESIDENT',我得到了循環錯誤。 – Manish 2014-10-20 12:24:00

+1

@Manish「Oracle評估父行的CONNECT BY條件的PRIOR表達式,以及表中每行的其他表達式」。 Oracle在查找後代時掃描整個表格 – Multisync 2014-10-20 12:27:25

+0

感謝您的回答。我現在明白了。 – Manish 2014-10-20 12:38:35

0

添加表達nocicle connect by nocycle