广度优先的sql树形查询

摘要:
当遇到SQL树处理时,可以使用以下方法通过使用循环来解决问题。
/*
注解:

以前遇到过一个同事,在处理树的时候,在sql语句里面用递归,造成性能非常低下。

在遇到sql处理树的时候,可以采用以下方法,用循环来解决。

主要思路:

找到Cateogry的children插入临时表,在临时表里做遍历,每到一条记录,都做一个操作:将它的children select 出来,插入临时表,最后,将临时表join Cateogry表。

*/

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[Proc_GetOffspringCategoryList]
@CategoryID uniqueidentifier,
@CategoryStandardID uniqueidentifier
AS
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID=object_id(N'#_Name') AND OBJECTPROPERTY(id, N'IsUserTable')=1)
    DROP TABLE #_Name

CREATE TABLE [dbo].[#_Name] (
    [ID] [bigint] IDENTITY (1, 1) NOT NULL,
    [ParentCategoryID] uniqueidentifier NULL ,
    [CategoryID] uniqueidentifier NULL ,
    [OrderNum] [int] NULL
) ON [PRIMARY]


/*do insert*/
IF @CategoryID is null
begin
    INSERT INTO #_Name
    SELECT
    [Category].[ParentCategoryID],
    [Category].[ID] AS CateogryID,
    [Category].[OrderNum]
    FROM
    [Category]
    WHERE
    [Category].[ParentCategoryID] is null AND
    [Category].[CategoryStandardID] = @CategoryStandardID
    order by [Category].[OrderNum]
end
else
begin
    INSERT INTO #_Name
    SELECT
    [Category].[ParentCategoryID],
    [Category].[ID] AS CateogryID,
    [Category].[OrderNum]
    FROM
    [Category]
    WHERE
    [Category].[ParentCategoryID] = @CategoryID AND
    [Category].[CategoryStandardID] = @CategoryStandardID
    order by [Category].[OrderNum]
end

DECLARE @ID BIGINT
SET @ID = 1
DECLARE @Parent uniqueidentifier
SET @Parent = (SELECT TOP 1 [CategoryID] FROM #_Name WHERE ID = @ID)

WHILE (@Parent IS NOT NULL)
BEGIN
    INSERT INTO #_Name
    SELECT
    [Category].[ParentCategoryID],
    [Category].[ID] as CategoryID,
    [Category].[OrderNum]
    FROM
    [Category]
    WHERE
    [Category].[ParentCategoryID] = @Parent AND
    [Category].[CategoryStandardID] = @CategoryStandardID
    order by [Category].[OrderNum]
   
    SET @ID = @ID + 1
    SET @Parent = (SELECT TOP 1 [CategoryID] FROM #_Name WHERE ID = @ID)
END


/*end do insert*/

SELECT [Category].*
FROM #_Name
JOIN Category ON [#_Name].[CategoryID] = [Category].[ID]

免责声明:文章转载自《广度优先的sql树形查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇07.LoT.UI 前后台通用框架分解系列之——轻巧的文本编辑器Hadoop实战之二~ hadoop作业调度详解(1)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle锁表查询和解锁方法

数据库操作语句的分类 DML:数据操纵语言,关键字:Insert、delete、update DCL:数据库控制语言 ,关键字:grant、remove DQL:数据库查询语言,关键字:select DDL:数据库模式定义语言,关键字:create oracle表在什么情况下会被锁住 DML锁又可以分为,行锁、表锁、死锁 行锁:当事务执行数据库插入、更...

mysql的itcast笔记

1 课程回顾 自定义标签&编码实战                             1)自定义标签步骤:                                                1.1 编写标签处理器类,继承SimpleTagSupport类,覆盖doTag方法                             ...

dt.select默认不区分大小写

1 今天发现了一个问题:select分组后的数据不对,大小写没有区分开,经查证,确认默认不区分大小写, 2 若要区分大小写,需要将DataTable的caseSensitive属性设为true,dt.CaseSensitive = true; DataTable dt = new DataTable(); dt.Columns....

高并发的几种处理方法

并发(英文Concurrency),其实是一个很泛的概念,字面意思就是“同时做多件事”,不过方式有所不同。在.NET的世界里面,处理高并发大致有以下几种方法: 1.异步编程 异步编程就是使用future模式(又称promise)或者回调机制来实现(Non-blocking on waiting)。如果使用回调或事件来实现(容易callback hell),...

mysql查看表中列信息

查看所有数据库中所有表的数据库名和表名 SELECT `TABLES`.`TABLE_SCHEMA`, `TABLES`.`TABLE_NAME` FROM `information_schema`.`TABLES` 查看所有数据库中所有基本表的数据库名和表名 SELECT `TABLES`.`TABLE_SCHEMA`, `TAB...

plsql和tsql常用函数比对

http://www.jb51.net/list/list_154_1.htm 数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from...