首页 新闻 赞助 找找看

sql获取父类下数据,包括子类的

0
悬赏园豆:50 [已解决问题] 解决于 2012-08-01 17:02

分类表有id,classname,parid,parpath四个字段,其中parpath记录顶级分类到自己的路径,例如:0,1,2,3,

信息表有categoryid字段,用来跟分类表相关联,先在要查找某个分类(不确定哪个)包括子类的数据,然后按id倒序排序,取10条即可。

 

请问大虾们语句应该如何写,可以建立索引,速度越快越好哇!!

问题补充:

这是分类表字段

这是info表字段

info表通过categoryid与category表联系

轩辕丨飛鳥的主页 轩辕丨飛鳥 | 初学一级 | 园豆:157
提问于:2012-07-30 13:47
< >
分享
最佳答案
1

你好,你这个很有代表性,对于一个表中有父子节点这种情况很常见,我在这儿给出我的权限配置中的模块管理中的一段sql函数,可自动得到这种情况,供你参考。兄弟,可是我的商业代码哟,给你分享出来了,你这50分的园丁是不是应该给我呢?

/****** Object:  UserDefinedFunction [dbo].[FN_GetSubModule]    Script Date: 07/30/2012 15:56:42 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



--查询所有子模块的表值函数
CREATE FUNCTION [dbo].[FN_GetSubModule] (@id AS INT )
RETURNS @temp TABLE
    (
      [id] INT ,
      [parentid] INT ,
      [Code] NVARCHAR(50) ,
      [FullName] NVARCHAR(200) ,
      [Category] NVARCHAR(50),
      [ImageIndex] NVARCHAR(50),
      [Target] NVARCHAR(100),
      [IsPublic] INT,
      [SortCode] INT,
      [levels] INT --levels表示栏目层次的,是必须有的!
    )
AS 
    BEGIN        
        DECLARE @level AS INT    --声明一个变量,用于保存栏目信息层次索引
        SELECT  @level = 0
        INSERT  INTO @temp
                SELECT  Id,
                        ParentId ,
                        Code ,
                        fullName ,
                        Category,
                        ImageIndex,
                        Target,
                        IsPublic,
                        SortCode,
                        @level
                FROM    dbo.PiModule
                WHERE   Id = @id AND DeleteMark = 0
    --先根据id获取根据节点的数据,@level初始为0,表示根目录
        WHILE @@rowcount > 0 
            BEGIN
                SET @level = @level + 1      
                INSERT  INTO @temp
                        SELECT  a.id ,
                                a.ParentId ,
                                a.Code ,
                                a.FullName ,
                                a.Category,
                                a.ImageIndex,
                                a.Target,
                                a.IsPublic,
                                a.SortCode,
                                @level
                        FROM    PiModule a
                                INNER JOIN @temp t ON a.parentid = t.id
                                                      AND t.levels = @level - 1   
                                                      AND a.DeleteMark = 0          
            END 
        RETURN    
    END

GO
收获园豆:30
.NET快速开发框架 | 小虾三级 |园豆:946 | 2012-07-30 15:59
其他回答(4)
0

子查询实现你这个。

收获园豆:3
悟行 | 园豆:12559 (专家六级) | 2012-07-30 13:55
0

没看明白你的需求,能把表之间的关系说清楚点吗?

收获园豆:2
轻狂の书生 | 园豆:1042 (小虾三级) | 2012-07-30 14:14
0
WITH CategoryCET(ID,ClassName,ParID,ParPath)
AS
(
    SELECT ID,ClassName,ParID,ParPath FROM Category WHERE ID = @ID
    UNION ALL
    SELECT A.ID,A.ClassName,A.ParID,A.ParPath FROM Category AS A INNER JOIN CategoryCET AS B ON A.ParID = B.ID
)
SELECT CategoryCET.*,Info.* FROM CategoryCET, Info 
WHERE CategoryCET.ID = Info.CategoryID
收获园豆:10
飞浪 | 园豆:243 (菜鸟二级) | 2012-07-30 16:04
0
收获园豆:5
Rookier | 园豆:652 (小虾三级) | 2012-07-30 17:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册