我需要在不同的表上编写一系列查询。所有这些都属于同一类型,一个记录有一个父记录,该父记录也可以有父记录。
我最终需要:
- 查找层次结构中的最高记录
- 查找层次结构中的最低点
- 查找所有优势
- 查找所有子体
我使用的是Filemaker Pro,我不相信递归SQL查询可以以本机方式运行。有一些方法可以使用本机(递归)函数来实现这四件事,这些函数可以在实体(表)上填充属性(字段),然后我可以查询这些属性。但是,我想了解SQL递归是如何工作的,看看是否可以找到更有效的方法来执行这些任务。
谢谢你的帮助!
SQL递归并不常见,许多SQL方言根本不支持它。FileMaker就是其中之一。它的SQL是相当基本的(例如,它没有LIMIT
),并且通常的效率低于本机FileMaker方法(例如,如果您使用独立的子查询,它似乎仍然会为主查询中的每行重新运行)。也就是说,如果您使用FileMaker并对递归SQL感兴趣,那么它必然是一个纯粹的学术练习。如果你想了解它,那么维基百科上这篇关于层次结构和递归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会抱怨找不到它。要解决此问题,请先创建一个字段,保存它,然后再次编辑并输入公式。