`
justshare
  • 浏览: 106035 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

无限分级数量查询优化

阅读更多
无限分级的数据查询是个头痛的问题,递归查询类别,再组合成字符串,用 in 来解决子类所有产品的问题,但是这个效率太低,低的让人无法接受,在此,有一个SQL的方法,可让我们提高效率。
-----提取子类的所有类别ID
create function GetChild (@id int)
returns @t table(id int)
as
begin
    insert @t select classid from mproclass where parentid = @id
    while @@rowcount > 0
        insert @t select a.classid from mproclass as a inner join @t as b
        on a.parentid = b.id and a.classid not in(select id from @t)
   return
end
-----提取子类以及自己ID的所有类别ID
create function GetChildAndSelf (@id int)
returns @t table(id int)
as
begin
    insert @t values (@id)
    insert @t select classid from mproclass where parentid = @id
    while @@rowcount > 0
        insert @t select a.classid from mproclass as a inner join @t as b
        on a.parentid = b.id and a.classid not in(select id from @t)
   return
end

以上是最佳方案

查询该类别的产品数据的sql为:
sql = "select * from mProduct as a inner join (select [id] from GetChildAndSelf("+classid+")) as b on a.classid=b.id order by psortid desc,pdate desc";

太爽了!

网上还有其他几种方法,贴出来大家一起学习学习

一、
declare   @table   table(id   int,upperid   int)
insert   into   @table
select   1,           2
union   all   select   3,           2
union   all   select   4,           1
union   all   select   5,           3
declare   @upperid   int  
set   @upperid=2;
with   result(id,upperid)
as
(
select   id,upperid   from   @table   where   upperid=@upperid
union   all
select   a.id,a.upperid   from   @table   a   inner   join   result   b   on   a.upperid=b.id
)
select*from   result
/*
id                     upperid
-----------   -----------
1                       2
3                       2
5                       3
4                       1

(4   row(s)   affected)
*/

二、
Create   table   t(id   int,upperid   int)
insert   into   t
select   1,           2
union   all   select   3,           2
union   all   select   4,           1
union   all   select   5,           3
select   *   from   t
create   function   aa(@upperid   int)
returns   @t   table   (id   int,upperid   int,level   int)
as
begin
declare   @i   int
set   @i=1
insert   into   @t
select   *,@i   from   t   where   upperid=@upperid
while   @@rowcount> 0
begin
set   @i=@i+1
insert   into   @t
select   a.*,@i   from   t   a   left   join   @t   b   on   a.upperid=b.id
where   b.level=@i-1
end
return
end

select   *   from   dbo.aa(1)

id                     upperid           level              
-----------   -----------   -----------  
4                       1                       1

(所影响的行数为   1   行)

select   *   from   dbo.aa(2)

id                     upperid           level              
-----------   -----------   -----------  
1                       2                       1
3                       2                       1
4                       1                       2
5                       3                       2


三、
----创建测试数据
if   object_id( 'tbTest ')   is   not   null
drop   table   tbTest
if   object_id( 'spGetChildren ')   is   not   null
drop   proc   spGetChildren
GO
create   table   tbTest(id   int,     upperid   int)
insert   tbTest
select   1,           2   union   all
select   3,           2   union   all
select   4,           1   union   all
select   5,           3
GO
----创建存储过程
create   proc   spGetChildren   @id   int
as
        declare   @t   table(id   int)
        insert   @t   select   id   from   tbTest   where   upperid   =   @id
        while   @@rowcount   >   0
                insert   @t   select   a.id   from   tbTest   as   a   inner   join   @t   as   b
                on   a.upperid   =   b.id   and   a.id   not   in(select   id   from   @t)
        select   *   from   @t
GO

----执行存储过程
declare   @upperid   int
set   @upperid   =   2
EXEC   spGetChildren   @upperid

----清除测试环境
drop   proc   spGetChildren
drop   table   tbTest

/*结果
id                    
-----------  
1
3
4
5
*/
[ZT  http://www.cnblogs.com/skylaugh/archive/2008/06/03/1213133.html]
分享到:
评论

相关推荐

    无限分级------C#+sqlserver

    无限分级通常指的是在数据库中存储的数据结构呈现出树状或者层级结构,如组织结构、菜单系统等,每个节点可能有任意数量的子节点,且没有预设的最大深度。 首先,无限分级的数据库设计通常采用自引用的方式,即在同...

    Access版本易语言树型框无限分级

    如果数据库中的分类记录没有明确的层级限制,那么这个过程应该是递归的,即每个节点都可以有任意数量的子节点,以此实现无限分级。 在易语言中,我们可以创建一个函数,接收当前节点的ID和父节点作为参数,递归查询...

    zencart 左边导航菜单无限分级

    在网站菜单设计中,无限分级意味着菜单可以包含任意数量的子级,而不仅仅局限于两层或三层。这种设计允许商家灵活地组织产品类别,特别是对于拥有复杂产品结构的大型在线商店而言,能够提供更清晰的导航路径。 无限...

    多用户无限分级的模拟文件管理系统

    无限分级通常指的是文件系统的目录层次结构,允许用户创建任意数量的子目录,形成一个树形结构。这种结构便于组织大量文件,使得用户可以轻松地找到所需的信息。无限分级的特性包括: 1. 目录结构:用户可以创建多...

    Winform TreeView控件无限分级绑定数据&获取选项

    要实现无限分级,我们需要设计一个递归数据结构,如自引用的类,以表示具有任意数量级别的节点。例如,我们可以创建一个名为`TreeNodeModel`的类,它包含一个`Children`属性,用于存储子节点的列表: ```csharp ...

    mysql 无限级分类实现思路

    此外,由于递归查询可能导致大量的数据库操作,当分类数量庞大时,可能会造成性能瓶颈。不过,这种设计在增加、删除和更新分类时相对简单。 ### 2. 字符串表示法 第二种方案是将父类ID以逗号分隔的形式存储在一个...

    Access版本易语言树型框无限分级-易语言

    无限分级意味着在理论上可以添加任意数量的层级。在易语言中,这通常涉及到动态创建和管理节点,以及处理节点间的父子关系。 为了实现这个功能,开发者需要: 1. **数据结构设计**:定义一个数据结构来存储树型框...

    实现无限树形结构

    在现代数据库设计中,无限树形结构(或称无限分级结构)是一种常见但复杂的设计模式,它允许数据以层级的方式组织,且每一层级可以包含任意数量的子层级。这种结构在分类系统、论坛、评论树以及文件系统等场景中尤为...

    ASP无限级分类代码 提供无限级分类的完整演示,带数据库

    6. 性能优化:由于无限级分类可能会导致大量的数据库查询,因此在实际应用中,可能需要考虑缓存策略,比如预加载部分常用的数据,或者使用存储过程来提高查询效率。 7. 用户交互:为了让用户能够方便地管理和浏览...

    jstree创建无限分级树的方法【基于ajax动态创建子节点】

    在本文中,我们将探讨如何使用jstree和AJAX动态地构建无限分级的树形菜单。首先,我们需要了解基本的数据库设计和数据获取方法。 数据库表结构是构建树的基础。在本例中,表`Menu`有两个关键字段:`Id`(主键)和`...

    网络游戏-分级无线网络中的选路区域更新.zip

    "分级无线网络中的选路区域更新"这一主题聚焦于如何在这样的网络架构中有效地管理和优化路由策略。无线网络通常由多个层次组成,包括接入点、基站、网关等,每个层次都有其特定的职责和功能。路由区域更新是网络中一...

    设置用户等级分类信息

    4. **性能优化**:对于大规模用户群体,频繁的等级查询与更新操作可能成为系统瓶颈。因此,应考虑采用缓存技术、异步处理等方式优化性能,减少数据库负担。 5. **安全性考量**:确保用户等级信息的安全存储与传输,...

    8-6.时序数据库的四个误区.pdf

    如果仅优化了某一类型的查询,可能会牺牲其他查询的性能。优秀的时序数据库如InfluxDB iox旨在同时提供一流的指标查询和分析查询性能,满足多样化的查询场景。 【误区四:计算与存储耦合】 传统的时序数据库通常...

    搭建完整灾备系统优化医院信息化建设借鉴.pdf

    这一方案不仅实现了数据的跨盘阵实时镜像和快速故障恢复,还支持存储阵列的离线维护、无中断业务运行、无限制的主机数量(License-Free)、快照功能以回溯到正常工作时间点等优点。因此,平度市人民医院的HIS系统...

    分级真空预压法加固吹填土过程中孔隙分布特征 (2012年)

    - **孔径分布的变化**:初始状态下,吹填土的孔隙主要集中在较大的尺寸范围,随着固结压力的增加,这些大孔隙被逐步压缩,最终导致孔隙分布向着更多数量的小孔隙方向发展。这种孔隙分布的变化对于提高土体的整体稳定...

    图书管理系统需求分析、流程图

    - 书证管理:系统需维护读者信息,支持新增读者记录,以适应读者数量的增长。 - 借还处理:读者通过系统办理借书和还书,系统自动处理借阅状态,如逾期罚款等。 - 罚款处理:对超期未还的书籍,系统会计算罚款...

    电子商务平台--百顺商城BSShop V2.0 标准版.rar

    4. 信息树形分类级别无限分级 5. 设定信息分类Meta标签,方便搜索引擎(百度、谷歌)快速抓取 6. 设定信息分类Title内容,方便搜索引擎(百度、谷歌)快速抓取 7. 生成静态信息分类页面,方便搜索引擎(百度、谷歌)...

    电子商务平台--百顺商城BSShop v2.0 整站静态版.rar

    4. 信息树形分类级别无限分级 5. 设定信息分类Meta标签,方便搜索引擎(百度、谷歌)快速抓取 6. 设定信息分类Title内容,方便搜索引擎(百度、谷歌)快速抓取 7. 生成静态信息分类页面,方便搜索引擎(百度、谷歌)...

    长登网站管理系统的详细介绍

    3. **栏目模块**:支持创建无限数量的网站主栏目,例如“关于我们”、“产品展示”、“新闻中心”等,且所有栏目均可在后台进行添加、删除或修改操作。 4. **页面模块**:允许创建无限数量的子页面,如“公司简介...

Global site tag (gtag.js) - Google Analytics