是否可以在Access中创建递归查询?

THE*_*HEn 18 recursion ms-access hierarchy

我有一张job桌子

Id
ParentID
jobName
jobStatus
Run Code Online (Sandbox Code Playgroud)

根ParentID为0.

是否可以在Access中创建查询以查找给定的根job?数据库是MDB,没有链接表.Access版本是2003.A job可以是几个级别的盛大孩子.

poi*_*ter 26

在Access中可以创建查询以查找给定作业的根.不要忘记VBA功能的强大功能.您可以在VBA模块中创建递归函数,并将其结果用作查询中的输出字段.

例:

Public Function JobRoot(Id As Long, ParentId As Long) As Long
   If ParentId = 0 Then
      JobRoot = Id
      Exit Function
   End If

   Dim Rst As New ADODB.Recordset
   Dim sql As String
   sql = "SELECT Id, ParentID FROM JobTable WHERE Id = " & ParentId & ";"
   Rst.Open sql, CurrentProject.Connection, adOpenKeyset, adLockReadOnly

   If Rst.Fields("ParentID") = 0 Then
      JobRoot = Rst.Fields("Id")
   Else
      JobRoot = JobRoot(Id, Rst.Fields("ParentID"))    ' Recursive.
   End If

   Rst.Close
   Set Rst = Nothing
End Function
Run Code Online (Sandbox Code Playgroud)

您可以使用查询构建器或仅在查询字段中使用参数键入函数名称,从查询中调用此递归函数.

它会产生根.

(我认为OP现在已经有一年了,但是当每个人都说出不可能的事情时,我不得不回答).

  • 虽然我赞同你的帖子,但原来的问题确实限制了查询的答案,事实上,如果没有VBA,这是不可能的.将"在查询中"解释为"不依赖于自定义VBA函数"的含义是否公平是另一个问题.我认为在这里提供你的解决方案是好的,即使它不是原始海报所寻求的,因为具有相同问题的其他人可能没有任何疑虑它不是纯粹的SQL答案. (11认同)

Pet*_*ter 8

不,不是.SServer 2005之后SQL Server支持递归查询,但Access中不支持.

如果您事先知道级别数,则可以编写查询,但它不是递归查询.

在SQL Server中,使用CTE(SQL扩展):请参阅http://blog.crowe.co.nz/archive/2007/09/06/Microsoft-SQL-Server-2005---CTE-Example-对的一simple.aspx

但是常规SQL没有Recursivity支持.


tpd*_*pdi 5

不能递归查询。

您可以执行任意数量的左连接,但您只能上升与连接数量相同的级别。

或者您可以使用Celko 的“嵌套集模型”来检索所有父级。这将需要修改您的表结构,从而使插入和更新更加复杂。