【问题标题】:Recursive selection of categories递归选择类别
【发布时间】:2012-09-20 01:36:13
【问题描述】:

在我的数据库中,我有下表:

Category: {[Name: VarChar, TopCategory: VarChar]}

表格内容如下:

现在我需要在递归语句中使用with-clause 从类别Computer Science 的所有子类别中获取所有名称。 这必须使用 SQL,而不是 PHP 或其他编程语言来完成。

所有子类别不仅意味着直接后代,而且在这种情况下还意味着 C++Java 我该怎么做?

到目前为止我所做的:

SELECT name FROM category WHERE (topcategory = 'Computer Science')

【问题讨论】:

  • 你想用逗号分隔值吗?

标签: sql postgresql recursion


【解决方案1】:

我们开始吧:

WITH RECURSIVE cte_t1 (name, topcategory, Level)
AS
(
SELECT name, topcategory, 0 AS Level
FROM Category
WHERE topcategory = N'ComputerScience'
UNION ALL
SELECT t1.name, t1.topcategory, Level + 1
FROM Category t1, cte_t1 ctet1
WHERE ctet1.name= t1.topcategory
)
SELECT Level, topcategory, name
FROM cte_t1

【讨论】:

  • 为什么没用?您将得到 John Woo 的答案所没有的递归结果
  • 现在是。当它是某个示例的复制粘贴时,我投了反对票,而您甚至都没有费心去适应、修复或测试。
  • 请注意,物化路径(扩展 ltree)可用于这种目的,并且可以轻松快速地进行嵌套类别。
  • 谢谢你,迈克尔。我没有从任何地方复制和粘贴,而是我自己的 SQL Server 编辑器。我创建了一个名为@table1 的表变量,其中包含字段类别和父项。我注意到发布答案时我没有正确翻译名称并在之后进行了编辑。但是我设计了表格,编写了查询并测试了结果。只是用我自己的假名。
【解决方案2】:

如果你的数据库是oracle,可以试试(sql fiddle):

select * from category 
  start with name = 'Computer Science'
connect by prior name = top_category

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2023-03-29
    相关资源
    最近更新 更多