2013-07-09 90 views
0

我需要在不同的表上編寫一系列查詢。它們都是同一類型的,一條記錄有一條父母記錄,也可以有父母記錄。SQL遞歸如何工作?

我最終將需要:

  1. 查找層次
  2. 最高記錄找到的最低點在層次
  3. 找到所有長輩
  4. 找到所有後代

我正在使用Filemaker Pro,我不認爲遞歸SQL查詢可以本地運行。有一些方法可以使用本地(遞歸)函數來實現所有4件事,這些函數可以填充實體(表)上的屬性(字段),然後我可以查詢它們。但是,我想了解SQL遞歸如何工作以查看我是否可以找到更有效的方式來執行這些任務。

感謝您的幫助!

+0

我知道您可以使用SQL從FileMaker查詢其他數據庫,但我不知道您可以使用SQL來查詢FileMaker數據庫。 – zneak

+0

@zneak從Filemaker 12起,[ExecuteSQL](http://www.filemaker.com/12help/html/func_ref3.33.6.html)函數添加了這樣做的功能。 – cml

回答

2

SQL遞歸併不常見,許多SQL方言根本不支持它。 FileMaker就是其中之一。它的SQL是非常基本的(例如,它沒有LIMIT),通常效率比本地FileMaker方法效率低(例如,如果您使用獨立的子查詢,它似乎仍然爲主查詢中的每一行重新運行)。這就是說,如果您使用FileMaker並對遞歸SQL感興趣,它肯定是一個純粹的學術練習。如果你喜歡它,那麼this Wikipedia article on hierarchical and recursive SQL可能是一個好的開始。

但是你不需要SQL來處理你正在做的事情;你可以用相當簡單的FileMaker計算完成所有這些。假設你的等級表採用IDParent ID和兩個關係,ParentChild,創建以下字段:

Root ID = 
If(IsEmpty(Parent::ID); ID; /* else */ Parent::Root ID) 

Leaf IDs = 
If(IsEmpty(Child::ID); ID; /* else */ List(Child::Leaf IDs)) 

Ancestor IDs = 
List(Case(not IsEmpty(Parent::ID); Parent::Ancestor IDs); ID) 

Descendant IDs = 
List(ID; Case(not IsEmpty(Child::ID); List(Child::Descendant IDs))) 

正如你看到的每個字段有一個遞推公式是指本身。添加字段後,您將無法立即輸入該字段,因爲此時該字段尚未保存,FileMaker會抱怨無法找到該字段。要解決這個問題,請先創建一個字段並保存,然後再次編輯並輸入公式。

+0

我正在使用的數據模型很大程度上使用此子/父概念來擴展定製靈活性(即產品組件化)。我試圖找出你列出的函數有哪些其他的替代方法,原因有兩個:1)因爲它在數據模型中被大量使用,我希望我不必混淆關係圖和2 )我將不得不使用這些查詢的結果(遞歸計算字段)作爲另一個查詢中的「where」子句,並且我期望更好地理解整個概念,以瞭解哪種方法是最有效和最靈活的方法。 – cml

+0

我正在處理的總體問題是[這一個](http://tinyurl.com/ko9jctv),如果您有任何想法,我會很感激您的意見。 – cml

+1

'LIMIT'不是標準的。這是一個MySQL擴展。 – zneak