我有一个问题,我想知道是否有一个优雅的解决方案。这是一个真正的业务问题,而不是课堂作业!
我有一个包含成千上万条记录的表,其中一些是彼此相关的组。
该数据库是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。
我希望能够在表格中显示此表中的所有记录。然后,我希望用户能够右键单击任何组中的任何记录,并且系统希望找到所有相关记录并将其显示在某种树中。
现在,我显然可以蛮力解决此问题,但我想问一下社区是否可以看到一个更优雅的答案。
使用 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