不符合ANSI標準的SQL它不是,沒有。那麼,這不是真的。您可以執行左外連接並放入足夠的深度以覆蓋可能的最大深度,但除非您限制最大深度幷包含多個連接,否則它不會始終有效。
如果你的行集合足夠小(比如小於1000),只需要檢索它們然後找出它們。它很可能會比單遍讀取更快。
您可以批處理父級遍歷。有如下查詢:
SELECT t1.id id1, t1.parent parent1,
t2.id id2, t2.parent parent2,
t3.id id3, t3.parent parent3,
t4.id id4, t4.parent parent4,
t5.id id5, t5.parent parent5
FROM mytable t1
LEFT OUTER JOIN mytable t2 ON t1.parent = t2.id
LEFT OUTER JOIN mytable t3 ON t2.parent = t3.id
LEFT OUTER JOIN mytable t4 ON t3.parent = t4.id
LEFT OUTER JOIN mytable t5 ON t4.parent = t5.id
WHERE t1.id = 1234
並將其擴展到任何你想要的數字。如果最後檢索到的父項不爲空,那麼您不在樹的頂部,因此再次運行查詢。這種方式,你應該希望減少到1-2往返。
除此之外,你可以看看在ID中編碼數據的方式。這是不推薦,但如果你限制,比方說,每個節點有100個孩子,你可以這麼說,一個ID 10030711節點有10路 - > 03 - > 07 - > 11這當然有其他的問題(如最大ID的長度),當然它是hacky。
另外值得一提的是,有在SQL分層數據兩種基本模式。鄰接列表和嵌套集合。你的方式(這很常見)是一個鄰接集。雖然嵌套集合並不能真正幫助解決這種情況,但插入操作很複雜。
不幸的是我的組行是合理的大,甚至不斷增加。 – 2009-08-26 15:33:53