我需要在不同的表上編寫一系列查詢。它們都是同一類型的,一條記錄有一條父母記錄,也可以有父母記錄。SQL遞歸如何工作?
我最終將需要:
- 查找層次
- 最高記錄找到的最低點在層次
- 找到所有長輩
- 找到所有後代
我正在使用Filemaker Pro,我不認爲遞歸SQL查詢可以本地運行。有一些方法可以使用本地(遞歸)函數來實現所有4件事,這些函數可以填充實體(表)上的屬性(字段),然後我可以查詢它們。但是,我想了解SQL遞歸如何工作以查看我是否可以找到更有效的方式來執行這些任務。
感謝您的幫助!
我需要在不同的表上編寫一系列查詢。它們都是同一類型的,一條記錄有一條父母記錄,也可以有父母記錄。SQL遞歸如何工作?
我最終將需要:
我正在使用Filemaker Pro,我不認爲遞歸SQL查詢可以本地運行。有一些方法可以使用本地(遞歸)函數來實現所有4件事,這些函數可以填充實體(表)上的屬性(字段),然後我可以查詢它們。但是,我想了解SQL遞歸如何工作以查看我是否可以找到更有效的方式來執行這些任務。
感謝您的幫助!
SQL遞歸併不常見,許多SQL方言根本不支持它。 FileMaker就是其中之一。它的SQL是非常基本的(例如,它沒有LIMIT
),通常效率比本地FileMaker方法效率低(例如,如果您使用獨立的子查詢,它似乎仍然爲主查詢中的每一行重新運行)。這就是說,如果您使用FileMaker並對遞歸SQL感興趣,它肯定是一個純粹的學術練習。如果你喜歡它,那麼this Wikipedia article on hierarchical and recursive SQL可能是一個好的開始。
但是你不需要SQL來處理你正在做的事情;你可以用相當簡單的FileMaker計算完成所有這些。假設你的等級表採用ID
和Parent ID
和兩個關係,Parent
和Child
,創建以下字段:
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會抱怨無法找到該字段。要解決這個問題,請先創建一個字段並保存,然後再次編輯並輸入公式。
我知道您可以使用SQL從FileMaker查詢其他數據庫,但我不知道您可以使用SQL來查詢FileMaker數據庫。 – zneak
@zneak從Filemaker 12起,[ExecuteSQL](http://www.filemaker.com/12help/html/func_ref3.33.6.html)函數添加了這樣做的功能。 – cml