广度优先的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]

转载于:https://www.cnblogs.com/jinweijie/archive/2007/05/16/748570.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值