【问题标题】:SQL - How to parse hierarchy levels from path columnSQL - 如何从路径列解析层次结构级别
【发布时间】:2018-01-03 10:32:36
【问题描述】:

我正在尝试通过 API 表示分层数据,并且正在寻找可以在 SQL 端实现的解决方案(从 API 调用的过程)。我有一列表示从最高父级到其子级的跟踪(“ID_Path”),并且正在尝试从分支中的项目向下排序。

为了解释,我有一个 ID 为 215548 的“袋子”物品,里面有 2 个直系孩子,每个下面都有一个孩子。解释:

ID: 215548

ID_Path: 215548 < 215467 < 215465 < 215428 < 0

因此,215548 是最高父级 0 的后代。215548 以下的子级是:

ID: 139269

ID_Path: 139269 < 215548 < 215467 < 215465 < 215428 < 0

ID: 262379

ID_Path: 262379 < 215548 < 215467 < 215465 < 215428 < 0

从这个例子中,你可以看到我是如何显示 ID 路径和层级关系的。但是,当我在 215548 上调用 API 时,我想看到 215548 的“级别”为 0,而 139269 和 262379 的“级别”为 1。我想知道如何在我的程序中进行解析以获取此信息结果。

在我的程序中,我目前有:

USE [database]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[calculation_table]
@myid INT
AS BEGIN
SELECT * FROM ITEM WHERE ID_Path LIKE '%' + cast(@myid AS nvarchar)  + '%'
END

如何处理处理级别?有没有办法可以从路径中的

感谢您的帮助。谢谢!

【问题讨论】:

  • 你的路径是 nvarchar 吗?
  • 如果是这样,我建议不要那样做。拥有您的id 列,并添加一个引用父项的idparentId 列,然后以这种方式构建层次结构。然后,您处理来自 2 列之一的 id 值,而不是剖析字符串值来解决它。
  • 看看这个例子:stackoverflow.com/a/25551203/57475

标签: c# sql sql-server parsing hierarchy


【解决方案1】:

我不是 100% 清楚你在追求什么,但希望这会让你走上正确的道路。

IF OBJECT_ID('tempdb..#TestData', 'U') IS NULL 
BEGIN   -- DROP TABLE #TestData;
    CREATE TABLE #TestData (
        ID INT NOT NULL,
        ID_Path VARCHAR(1000) NOT NULL  
        );
    INSERT #TestData (ID, ID_Path) VALUES 
        (1, '215548 < 215467 < 215465 < 215428 < 0'),
        (2, '139269 < 215548 < 215467 < 215465 < 215428 < 0'),
        (3, '262379 < 215548 < 215467 < 215465 < 215428 < 0');
END;

--=================================================================

DECLARE @ID INT = 215465;

SELECT 
    *
FROM 
    (
    SELECT 
        td.ID,
        td.ID_Path,
        NodeeLevel = ROW_NUMBER() OVER (PARTITION BY td.ID ORDER BY sc.ItemNumber DESC) - 1,
        Child_ID = CAST(sc.Item AS INT),
        Parent_ID = LAG(CAST(sc.Item AS INT), 1) OVER (PARTITION BY td.ID ORDER BY sc.ItemNumber DESC)
    FROM 
        #TestData td
        CROSS APPLY dbo.SplitCSVToTable8K(td.ID_Path, '<') sc
        /* code for splitter function can be found here: http://www.sqlservercentral.com/articles/Tally+Table/72993/ */
    ) x
WHERE 
    x.Child_ID = @ID;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 2013-07-04
    • 2023-04-03
    相关资源
    最近更新 更多