一尘不染

确定SQL数据库中记录的层次结构

sql

我有一个问题,我想知道是否有一个优雅的解决方案。这是一个真正的业务问题,而不是课堂作业!

我有一个包含成千上万条记录的表,其中一些是彼此相关的组。

该数据库是SQL 2005。

ID是主键。如果该记录替换了先前的记录,则该记录的ID在REP_ID列中。

ID   REP_ID

E     D
D     B
C     B
B     A
A     NULL

因此,在此示例中,A是原始行,B替换了A,C替换了B失败,D成功替换了B,最后E替换了D。

我希望能够在表格中显示此表中的所有记录。然后,我希望用户能够右键单击任何组中的任何记录,并且系统希望找到所有相关记录并将其显示在某种树中。

现在,我显然可以蛮力解决此问题,但我想问一下社区是否可以看到一个更优雅的答案。


阅读 142

收藏
2021-05-16

共1个答案

一尘不染

使用 CTE
建立您的层次结构。就像是

CREATE TABLE #test(ID CHAR(1), REP_ID CHAR(1) NULL)

INSERT INTO #test VALUES('E','D')
INSERT INTO #test VALUES('D','B')
INSERT INTO #test VALUES('C','B')
INSERT INTO #test VALUES('B','A')
INSERT INTO #test VALUES('A',NULL)


WITH tree(  ID, 
        REP_ID,
        Depth
        )
AS
(
    SELECT 
    ID,
    REP_ID,         
    1 AS [Depth]                   
    FROM
    #test
    WHERE
    REP_ID IS NULL

    UNION ALL

    SELECT 
    [test].ID,
    [test].REP_ID,          
    tree.[Depth] + 1 AS [Depth]                   
    FROM
    #test [test]
    INNER JOIN
    tree
    ON
    [test].REP_ID = tree.ID
)

SELECT * FROM tree
2021-05-16