【问题标题】:T-SQL Tree Search Select from set of nodes if they are under a parentT-SQL 树搜索 从一组节点中选择,如果它们在父节点下
【发布时间】:2012-08-01 15:02:54
【问题描述】:

T-SQL 树搜索

如果它们在父节点下,则从一组节点中选择

我在 MSSQL Db (80000+) 记录中有一个非常大的树。我的客户请求通过文本LIKE 命令快速搜索树。 LIKE 命令返回

是否有一些递归命令可以快速检查每个树的树以查看它们是否在特定节点下?

编辑: 但是我认为它相当清楚......

我使用的是 SQL Server 2005。

Table Schema
 - (pK) Id
 - (fK) ParentId
 - FirstName
 - LastName

我有递归调用,可以快速下降几个级别。但是,要进行名称搜索,我必须轮询整个树,它可能有几百层深,这不是一个选项。我希望帮助设计一个查询,以便我可以首先搜索整个表以查找名称匹配并过滤不属于相关树的记录。

【问题讨论】:

  • 请向我们展示您的表架构、您使用的数据库引擎和版本(DB2、SQL Server?)。事实上,您的问题可能会被关闭为“不是真正的问题”

标签: sql sql-server-2005 recursive-query tree-search


【解决方案1】:

您可以使用递归 CTE 来做到这一点——您需要代码示例吗?

像这样(这段代码已经测试过了)

WITH recurseTree AS
(
   SELECT * 
   FROM tableName
   WHERE Id = @parentID
   UNION ALL
   SELECT c.*
   FROM tableName c
   JOIN recurseTree p ON c.parentID = p.id
)
SELECT * 
FROM recurseTree

注意:更多新版本 (2008+) 为您提供了一种特殊的数据类型 (hierarchyid) 用于快速遍历树。这可能是最好的方法,其他任何事情都不会那么快。升级!!

【讨论】:

  • 那太好了。我们一直在尝试编写它,但还没有完全正确。
  • 您不能从子查询中进行递归调用,至少在 SQL Server 2005 中不能。不确定以后的版本。
  • 我说的是如果你尝试运行这个查询,SQL Server 会给你以下错误:Recursive references are not allowed in subqueries.
  • @JeremyWiggins - 正如我所说,一年多来很好。我测试的这段代码。
【解决方案2】:

这应该可以帮助你:

;WITH CTE AS
(
    SELECT Id, ParentId, FirstName, LastName
    FROM YourTable
    UNION ALL
    SELECT B.Id, B.ParentId, B.FirstName, B.LastName
    FROM CTE A 
    INNER JOIN YourTable B
    ON A.ParentId = B.Id
)
SELECT *
FROM CTE
WHERE FirstName LIKE '%something%'
OPTION(MAXRECURSION 0)

【讨论】:

  • 我有这个但是在这个代码中它很慢你收集几千条记录(有问题的节点下的整个子树)然后过滤它。如果我们可以另辟蹊径,确定集合中的哪些节点在父节点之下,它可能会快得多。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多