我最终要做的是建立一个大型联接,该联接简单地将此表与其自身联系起来,遍及每个级别。
首先,我只在第一个级别组中填充表@topLevelGroups(如果您只有一个根,则可以跳过此步骤),然后在@userGroups中填充用户可以看到的组。
SELECt groupid, (level1 + CASE WHEN level2 IS NOT NULL THEN ' > ' + level2 ELSE '' END + CASE WHEN level3 IS NOT NULL THEN ' > ' + level3 ELSE '' END )as [breadcrumb]FROM ( SELECt g3.* ,g1.name as level1 ,g2.name as level2 ,g3.name as level3 FROM @topLevelGroups g1 INNER JOIN @userGroups g2 ON g2.parentid = g1.groupid and g2.groupid <> g1.groupid INNER JOIN @userGroups g3 ON g3.parentid = g2.groupid UNIOn SELECt g2.* ,g1.name as level1 ,g2.name as level2 ,NULL as level3 FROM @topLevelGroups g1 INNER JOIN @userGroups g2 ON g2.parentid = g1.groupid and g2.groupid <> g1.groupid UNIOn SELECt g1.* ,g1.name as level1 ,NULL as level2 ,NULL as level3 FROM @topLevelGroups g1) aORDER BY [breadcrumb]
这是一个相当大的技巧,并且显然仅限于一定数量的级别(对于我的应用程序,我可以选择一个合理的限制),问题是,支持的级别越多,联接的数量就成倍增加,因此速度要慢得多。
在代码中执行此操作肯定更容易,但是对我而言,这并非总是一种选择-有时我需要直接从SQL查询中获得此功能。
我接受这作为答案,因为这是我最终要做的,并且可能对其他人有用-但是,如果有人可以提出一种更有效的方法,我将其更改为他们。



