SQL递归究竟是如何工作的?

时间:2013-07-09 07:27:13

标签: sql recursion hierarchy filemaker recursive-query

我需要在不同的表上编写一系列查询。它们都属于同一类型,记录中有父记录,也可以有父记录。

我最终需要:

  1. 查找层次结构中的最高记录
  2. 查找层次结构中的最低点
  3. 查找所有优势
  4. 查找所有后代
  5. 我正在使用Filemaker Pro,我不相信递归SQL查询可以本机运行。有很多方法可以使用本机(递归)函数来实现所有4个事物,这些函数可以填充我可以查询的实体(表)上的属性(字段)。但是,我想了解SQL递归是如何工作的,看看我是否能找到一种更有效的方法来执行这些任务。

    感谢您的帮助!

1 个答案:

答案 0 :(得分: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会抱怨它无法找到它。要解决此问题,首先要创建一个字段,保存它,然后再次编辑它并输入公式。