sql查询树就像结构一样

时间:2009-11-19 18:48:27

标签: sql sql-server-2005 tree join

我有类似树的结构树,树中的叶子节点有产品,产品有Cods 我需要选择所有顶级类别(parent = null),它们具有与某些标准相匹配的叶子(Cods)......

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

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

3 个答案:

答案 0 :(得分:5)

这是一个共同的挑战。从关系数据库创建分层数据并不总是很优雅。如果不经常更新此数据,则可以选择将其作为XML进行拼接并将其缓存为应用程序。

如果您想将其保留在数据库中,这是一种常见的解决方案:Managing Hierarchical Data in MySQL

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我不知道您是否坚持使用此数据结构,但您应该真正查看文章Managing Hierarchical Data in MySQL以进行分层数据管理。

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