我需要在不同的表上编写一系列查询。它们都属于同一类型,记录中有父记录,也可以有父记录。
我最终需要:
我正在使用Filemaker Pro,我不相信递归SQL查询可以本机运行。有很多方法可以使用本机(递归)函数来实现所有4个事物,这些函数可以填充我可以查询的实体(表)上的属性(字段)。但是,我想了解SQL递归是如何工作的,看看我是否能找到一种更有效的方法来执行这些任务。
感谢您的帮助!
答案 0 :(得分:2)
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会抱怨它无法找到它。要解决此问题,首先要创建一个字段,保存它,然后再次编辑它并输入公式。