分类表有id,classname,parid,parpath四个字段,其中parpath记录顶级分类到自己的路径,例如:0,1,2,3,
信息表有categoryid字段,用来跟分类表相关联,先在要查找某个分类(不确定哪个)包括子类的数据,然后按id倒序排序,取10条即可。
请问大虾们语句应该如何写,可以建立索引,速度越快越好哇!!
这是分类表字段
这是info表字段
info表通过categoryid与category表联系
你好,你这个很有代表性,对于一个表中有父子节点这种情况很常见,我在这儿给出我的权限配置中的模块管理中的一段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
子查询实现你这个。
没看明白你的需求,能把表之间的关系说清楚点吗?
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