【问题标题】:SQL recursive query [duplicate]SQL递归查询[重复]
【发布时间】:2011-01-02 19:18:06
【问题描述】:

可能重复:
Recursive function in sql server 2005?

如何对表执行迭代查询?我有一个简单的表格,其中包含:

KeyField, childID, parentID

从 childID 开始,我想拉出 parentID,然后再次查询以查看该父级(现在是子级)是否有自己的父级,通过完整的层次结构向上工作,我该怎么做?

Microsoft SQL Server,版本号 09.00.3042

【问题讨论】:

  • 是的,有很多重复项 - 尽管这是令人讨厌的情况之一,除非您知道递归 CTE,否则您可能不知道要使用的搜索词。
  • 我之所以回答是因为我没有代表投票结束,并且我希望练习回答有关 CTE 的问题。希望一些 3k+ 人会以重复的形式关闭。
  • 感谢 OMG Ponies(喜欢这个名字)和 David,我显然需要阅读一些内容,是的,我从未听说过 CTE,但我现在知道了 :)

标签: sql sql-server-2005 recursion


【解决方案1】:

在 SQL Server 2005 及更高版本中,您最好对此类查询使用递归 CTE(公用表表达式)。 (在 SQL 2000 和更早的版本中,您只能使用递归存储过程)。

您需要以下内容:

WITH ParentChildRels (ParentId, ChildId, KeyField, HierarchyLevel) AS
(
   -- Base case
   SELECT
      ParentId,
      ChildId,
      KeyField,
      1 as HierarchyLevel
   FROM Records
   WHERE ChildId = @ChildId

   UNION ALL

   -- Recursive step
   SELECT
      r.ParentId,
      r.ChildId,
      r.KeyField,
      pr.HierarchyLevel + 1 AS HierarchyLevel
   FROM Records r
      INNER JOIN ParentChildRels pr ON
         r.ParentId = pr.ParentId
)

SELECT *
FROM ParentChildRels 
ORDER BY HierarchyLevel, ParentId, ChildId, KeyField

【讨论】:

  • 递归 WITH 是处理递归查询的 ANSI 标准,但支持有限。 Oracle 在 11g 中支持递归 WITH,但在 9i+ 中支持 WITH,它有自己的分层语法。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2015-07-13
  • 2014-12-19
  • 2012-12-05
  • 2016-01-25
  • 1970-01-01
相关资源
最近更新 更多