【问题标题】:sql query tree like structuresql查询树状结构
【发布时间】:2009-11-19 18:48:26
【问题描述】:

我有一个树状结构的类别,树中的叶节点有产品,产品有 Cods 我需要选择所有具有与某些条件匹配的叶子 (Cods) 的顶级类别 (parent=null)...

SELECT  
    Category.Id AS Id0_, 
    Category.Name AS Name0_, 
    Category.COrder AS COrder0_, 
    Category.Description AS Descript4_0_, 
    Category.ParentId AS ParentId0_, 
    Category.Description_En AS Descript6_0_, 
    Category.Name_En AS Name_En0_, 
    Category.ImagePath AS ImagePath0_ 
FROM
    Category 
    LEFT JOIN Category AS c1 ON Category.Id=c1.ParentId
    LEFT JOIN Category AS c2 ON c1.Id=c2.ParentId
    LEFT JOIN Category AS c3 ON c2.Id=c3.ParentId
    LEFT JOIN Category AS c4 ON c3.Id=c4.ParentId
    LEFT JOIN Product ON 
        c4.Id=Product.Category 
        OR c3.Id=Product.Category 
        OR c2.Id=Product.Category 
        OR c1.Id=Product.Category 
        OR Category.Id=Product.Category
    INNER JOIN Cod ON Cod.Product=Product.Id   
WHERE
    Category.ParentId is null 
    AND Cod.Hidden!='1' 
    AND 
    (
        cod.Stock>0 
        OR (cod.CodBare='0' AND Product.ProdType=8)) 
        AND Cod.Price>0
    )
ORDER BY Category.COrder

我的查询看起来像这样,但它不是一个解决方案,因为它非常非常慢......有人可以给我一个关于如何做到这一点的建议吗?

【问题讨论】:

  • 愚蠢的问题......“鳕鱼”是什么意思?
  • 查看我的问题的已接受答案stackoverflow.com/questions/1757370/…
  • 数据库是关于 Cods 的 MSSQL 2005 ...产品更像是具有多种变化的产品类型(如颜色大小等),代码是带有序列号/产品的实际产品代码
  • 查看这两个带有递归 CTE 的示例:firstsecond

标签: sql sql-server-2005 tree join


【解决方案1】:

这是一个常见的挑战。从关系数据库创建分层数据并不总是优雅的。如果这些数据没有不断更新,一种选择是将其作为 XML 输出并为应用程序缓存。

如果你想将它保存在数据库中,这是一个常见的解决方案:Managing Hierarchical Data in MySQL

【讨论】:

  • @DA,看看我在我的解决方案中发布的演示文稿。如果您喜欢嵌套集模型,您会更喜欢“改进”,即嵌套区间模型。
  • @Sergi,我不像以前那样经常使用 SQL,但我一直在学习新东西。会看的!
  • 这篇文章是中肯的,但不是解决方案,因为结构发生了相当大的变化,应用程序需要完全重写......我的错,我不认为它会达到这个......
【解决方案2】:

有多种解决方案来表示数据库中的树。我真的建议你看看这个演示文稿,Trees in the database。我通常使用具有多个级别和 150 万个叶子的数据库,嵌套区间模型非常有启发性。

【讨论】:

    【解决方案3】:

    我不知道你是否被这个数据结构卡住了,但你真的应该看看文章Managing Hierarchical Data in MySQL 了解分层数据管理。

    我使用了此处描述的解决方案(在 Oracle 和 MS SQL Server 中),速度非常快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多