SQL递归究竟是如何工作的



我需要在不同的表上编写一系列查询。所有这些都属于同一类型,一个记录有一个父记录,该父记录也可以有父记录。

我最终需要:

  1. 查找层次结构中的最高记录
  2. 查找层次结构中的最低点
  3. 查找所有优势
  4. 查找所有子体

我使用的是Filemaker Pro,我不相信递归SQL查询可以以本机方式运行。有一些方法可以使用本机(递归)函数来实现这四件事,这些函数可以在实体(表)上填充属性(字段),然后我可以查询这些属性。但是,我想了解SQL递归是如何工作的,看看是否可以找到更有效的方法来执行这些任务。

谢谢你的帮助!

SQL递归并不常见,许多SQL方言根本不支持它。FileMaker就是其中之一。它的SQL是相当基本的(例如,它没有LIMIT),并且通常的效率低于本机FileMaker方法(例如,如果您使用独立的子查询,它似乎仍然会为主查询中的每行重新运行)。也就是说,如果您使用FileMaker并对递归SQL感兴趣,那么它必然是一个纯粹的学术练习。如果你想了解它,那么维基百科上这篇关于层次结构和递归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会抱怨找不到它。要解决此问题,请先创建一个字段,保存它,然后再次编辑并输入公式。

最新更新