【问题标题】:How to find all the descendants with SQL?如何使用 SQL 查找所有后代?
【发布时间】:2011-09-30 18:26:07
【问题描述】:

每个实体可以有一个父级。我需要找到给定实体的所有后代。

仅使用 SQL 是否可行?

我只能从脚本的角度思考,不会像单独的sql那么快。

我正在使用 PHP 和 MS SQL Server 2005,以及学说 2 DBAL

【问题讨论】:

  • 你的意思是你希望找到每个实体的直接第一代后代,还是一个实体下 n 代的整个树?

标签: php sql sql-server sql-server-2005


【解决方案1】:

对于 SQL Server 2005+,您可以使用 recursive CTE

WITH cteRecursion AS (
    SELECT PrimaryKey, 1 AS Level
        FROM YourTable
        WHERE PrimaryKey = @GivenEntity
    UNION ALL
    SELECT t.PrimaryKey, c.Level+1
        FROM YourTable t
            INNER JOIN cteRecursion c
                ON t.ParentKey = c.PrimaryKey
)
SELECT PrimaryKey, Level
    FROM cteRecursion
    ORDER BY Level, PrimaryKey;

【讨论】:

  • 哇,这很整洁,谢谢。但我不明白@GivenEntity 部分,这是什么意思?抱歉,我是新手
  • @HappyDeveloper 在您的问题中,您说“我需要找到给定实体的所有后代”,因此 @GivenEntity 是代表您希望找到其后代的实体的值的变量。
【解决方案2】:

PHP 将一次运行一条 SQL 语句,因此您需要在循环中创建此列表。一个不错的选择是使用nested sets

【讨论】:

  • 我没有使用 ORM,只有 DBAL。我还能用这个吗?无论如何我都会读它,谢谢
  • 如果 SQL 语句是递归的(如 CTE)或循环,您可以运行单个 SQL 语句。
猜你喜欢
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2011-09-29
  • 1970-01-01
相关资源
最近更新 更多