我需要在不同的表上编写一系列查询。它们都是同一类型的,一条记录有一条父母记录,也可以有父母记录。SQL递归如何工作?
我最终将需要:
- 查找层次
- 最高记录找到的最低点在层次
- 找到所有长辈
- 找到所有后代
我正在使用Filemaker Pro,我不认为递归SQL查询可以本地运行。有一些方法可以使用本地(递归)函数来实现所有4件事,这些函数可以填充实体(表)上的属性(字段),然后我可以查询它们。但是,我想了解SQL递归如何工作以查看我是否可以找到更有效的方式来执行这些任务。
感谢您的帮助!
我需要在不同的表上编写一系列查询。它们都是同一类型的,一条记录有一条父母记录,也可以有父母记录。SQL递归如何工作?
我最终将需要:
我正在使用Filemaker Pro,我不认为递归SQL查询可以本地运行。有一些方法可以使用本地(递归)函数来实现所有4件事,这些函数可以填充实体(表)上的属性(字段),然后我可以查询它们。但是,我想了解SQL递归如何工作以查看我是否可以找到更有效的方式来执行这些任务。
感谢您的帮助!
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会抱怨无法找到该字段。要解决这个问题,请先创建一个字段并保存,然后再次编辑并输入公式。
我知道您可以使用SQL从FileMaker查询其他数据库,但我不知道您可以使用SQL来查询FileMaker数据库。 – zneak
@zneak从Filemaker 12起,[ExecuteSQL](http://www.filemaker.com/12help/html/func_ref3.33.6.html)函数添加了这样做的功能。 – cml