2013-07-09 59 views
0

我需要在不同的表上编写一系列查询。它们都是同一类型的,一条记录有一条父母记录,也可以有父母记录。SQL递归如何工作?

我最终将需要:

  1. 查找层次
  2. 最高记录找到的最低点在层次
  3. 找到所有长辈
  4. 找到所有后代

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

感谢您的帮助!

+0

我知道您可以使用SQL从FileMaker查询其他数据库,但我不知道您可以使用SQL来查询FileMaker数据库。 – zneak

+0

@zneak从Filemaker 12起,[ExecuteSQL](http://www.filemaker.com/12help/html/func_ref3.33.6.html)函数添加了这样做的功能。 – cml

回答

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会抱怨无法找到该字段。要解决这个问题,请先创建一个字段并保存,然后再次编辑并输入公式。

+0

我正在使用的数据模型很大程度上使用此子/父概念来扩展定制灵活性(即产品组件化)。我试图找出你列出的函数有哪些其他的替代方法,原因有两个:1)因为它在数据模型中被大量使用,我希望我不必混淆关系图和2 )我将不得不使用这些查询的结果(递归计算字段)作为另一个查询中的“where”子句,并且我期望更好地理解整个概念,以了解哪种方法是最有效和最灵活的方法。 – cml

+0

我正在处理的总体问题是[这一个](http://tinyurl.com/ko9jctv),如果您有任何想法,我会很感激您的意见。 – cml

+1

'LIMIT'不是标准的。这是一个MySQL扩展。 – zneak