SQL “tree-like” query - most parent group

后端 未结 6 1226
悲&欢浪女
悲&欢浪女 2020-12-09 07:22

I\'m having some trouble doing a \"tree-like\" query (what do we call this?) in SQL.

Take a look at my diagram below (table and column names are in danish - sorry ab

6条回答
  •  孤城傲影
    2020-12-09 07:51

    How about something like this:

    DECLARE @Customer TABLE(
            CustomerID INT IDENTITY(1,1),
            CustomerName VARCHAR(MAX)
    )
    
    INSERT INTO @Customer SELECT 'Customer1'
    INSERT INTO @Customer SELECT 'Customer2'
    INSERT INTO @Customer SELECT 'Customer3'
    
    DECLARE @CustomerTreeStructure TABLE(
            CustomerID INT,
            TreeItemID INT
    )
    
    INSERT INTO @CustomerTreeStructure (CustomerID,TreeItemID) SELECT 1, 1
    INSERT INTO @CustomerTreeStructure (CustomerID,TreeItemID) SELECT 2, 12
    INSERT INTO @CustomerTreeStructure (CustomerID,TreeItemID) SELECT 3, 1
    INSERT INTO @CustomerTreeStructure (CustomerID,TreeItemID) SELECT 3, 12
    
    DECLARE @TreeStructure TABLE(
            TreeItemID INT IDENTITY(1,1),
            TreeItemName VARCHAR(MAX),
            TreeParentID INT
    )
    
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001', NULL
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.001', 1
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.001.001', 2
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.001.002', 2
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.001.003', 2
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.002', 1
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.003', 1
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.003.001', 7
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.001.002.001', 4
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.001.002.002', 4
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '001.001.002.003', 4
    
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '002', NULL
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '002.001', 12
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '002.001.001', 13
    INSERT INTO @TreeStructure (TreeItemName,TreeParentID) SELECT '002.001.002', 13
    
    ;WITH Structure AS (
        SELECT  TreeItemID,
                TreeItemName,
                TreeParentID,
                REPLICATE('0',5 - LEN(CAST(TreeItemID AS VARCHAR(MAX)))) + CAST(TreeItemID AS VARCHAR(MAX)) + '\\' TreePath
        FROM    @TreeStructure ts
        WHERE   ts.TreeParentID IS NULL
        UNION ALL
        SELECT  ts.*,
                s.TreePath + REPLICATE('0',5 - LEN(CAST(ts.TreeItemID AS VARCHAR(5)))) + CAST(ts.TreeItemID AS VARCHAR(5)) + '\\' TreePath
        FROM    @TreeStructure ts INNER JOIN
                Structure s ON ts.TreeParentID = s.TreeItemID
    )
    
    SELECT  c.CustomerName,
            Children.TreeItemName,
            Children.TreePath
    FROM    @Customer c INNER JOIN
            @CustomerTreeStructure cts ON c.CustomerID = cts.CustomerID INNER JOIN
            Structure s ON cts.TreeItemID = s.TreeItemID INNER JOIN
            (
                SELECT  *
                FROM    Structure
            ) Children ON Children.TreePath LIKE s.TreePath +'%'
    ORDER BY 1,3
    OPTION (MAXRECURSION 0)
    

提交回复
热议问题