【问题标题】:SQL to retrieve tree structure nicelySQL很好地检索树结构
【发布时间】:2010-08-24 09:25:40
【问题描述】:

给定简单的数据结构:

ID    |    Category_Name    |    Parent_ID

例子:

1          Cars                    0
2          Boxes                   0
3          Lamborghinis            1
4          VW Camper Vans          1
5          Big Boxes               2
6          Small Boxes             2
7          Cereal Boxes            2
8          Broken Lambos           3
9          Yellow Ones             3
10         Rusty                   8
11         Milkshake Stained       8
12         Chocolate Flavour       11
13         Strawberry              11
14         Indiscernible Solution  11

代表一个简单的树形导航结构,以编程方式以可呈现的格式检索树的最佳方法是什么?我们可以创建一条 SQL 语句来“按顺序”检索它们吗?

感谢您的帮助!如果我的方法有误,也请随时发表评论。

我使用的是 SQL-Server 2000。

【问题讨论】:

  • 什么是数据库平台?许多常见的 SQL 解决方案是特定于平台的。
  • 您使用的是什么数据库?如果它的 MS-SQL 2005 及更高版本,你看过 Recursive CTE 的吗?

标签: sql sql-server database-design tree


【解决方案1】:

如果您使用的是 SQL Server 2008,您可能想尝试新的 hierarchyid 数据类型。

如果您不是,那么另一种方法是查看适用于所有数据库的 nested sets 模型。

如果您使用的是 SQL Server 2005 及更高版本,则可以使用 recursive CTEs 检索树结构。

【讨论】:

  • 那么唯一的方法是使用while循环,插入临时表并返回它们。不过,我敦促您研究嵌套集模型。
【解决方案2】:

我通常在我的应用程序代码中构建树结构。部分是因为我对 c# 比 SQL 更有信心,但也因为我通常需要将数据处理成合适的 c# 结构。

SQL 在递归结构(如列表和树)方面非常糟糕。如果我必须将树构建放在我的数据库中,我会选择存储过程。但可能有一种我不知道的聪明方法。

如果您使用 Oracle,您也许可以使用 Connect By 破解一些东西。

【讨论】:

    【解决方案3】:

    不适用于 SQL2000,但如果你设法升级到 2k5,你可以这样做

    WITH t AS(SELECT id, parent_id, category_name FROM mytable WHERE parent_id IS NULL
              UNION ALL
              SELECT c.id, c.parent_id, c.category_name FROM t p JOIN mytable c ON c.parent_id = p.id)
    SELECT * FROM t
    

    【讨论】:

    • 谢谢,很有趣!您认为是否有可能将其分解以在 SQL 2000 中工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2016-06-02
    相关资源
    最近更新 更多