zoukankan      html  css  js  c++  java
  • 广度优先的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]
  • 相关阅读:
    二叉查找中使用位运算符
    Python2021专业版激活码
    南邮计算机方向
    7.字符串、异常处理、文件和流(C++学习笔记)
    6.多态与抽象(C++学习笔记)
    5.对象类与继承(C++学习笔记)
    4.数组与指针(C++学习笔记)
    3.C++函数(C++学习笔记)
    2.C++控制语句(C++学习笔记)
    1.基本知识(C++学习笔记)
  • 原文地址:https://www.cnblogs.com/jinweijie/p/748570.html
Copyright © 2011-2022 走看看