与父母一起查找具有特定信息的孩子

时间:2017-12-30 11:04:47

标签: sql-server hierarchical-data

我正在尝试查找其父级具有来自不同关系表的某些特定信息的子级。 我有四个表,如下所示

enter image description here

搜索条件:获取所有父级为“广告资源”级别的“部分”,附加的用户名包含“a”字母,角色ID为“员工”(请参阅​​ LevelsUser 表关系)。

我尝试了CTE(公用表表达式)方法来找到正确的Section级别,但是在这里我必须将级别Id作为硬编码值传递,我不能搜索表中的所有Section。

WITH LevelsTree AS 
(
   SELECT Id, ParentLevelId, Level
   FROM Levels 
   WHERE Level='Section'  // here i need to pass value
   UNION ALL

   SELECT ls.Id, ls.ParentLevelId, ls.Level
   FROM Levels ls
   JOIN LevelsTree lt ON ls.Id = lt.ParentLevelId
)

SELECT * FROM LevelsTree

我需要找到符合上述条件的所有部分。 请帮帮我。

1 个答案:

答案 0 :(得分:1)

对于分层检查,您需要从中选择,然后加入同一个表Levels。所以这样的事情可以帮助你:

declare @parentLevelName varchar(20) = 'Inventory';

with cte as (
    select distinct 
        l1.id,
        l1.Level 
    from Levels l1
    join Levels l2 on l2.id=l1.ParentLevelId 
           and l2.Level = @parentLevelName -- use variable instead of hardcoded `Inventory`
    where l1.Level='Section' -- replace `Section` with @var containing your value
) select * from cte
join LevelUsers lu on lu.LevelId=cte.id
join Users u on u.Id = lu.UserId 
                and u.UserName like '%a%' -- this letter check is not efficient
join Role r on r.id=lu.RoleId and r.Role='employee'

注意,上述查询仅从您在数据库模式中描述的4个表中选择数据。但是,原始查询包含对您尚未描述的HierarchyPosition表的引用。如果您确实需要包含HiearchyPosition引用,请指定它与其他4个表的关系。

另请注意,用于满足and u.UserName like '%a%'要求的条件User name containing 'a' letter效率不高,因为前导%会阻止使用索引。如果可能,请考虑将您的要求更改为User name starts with 'a' letter。这种方式and u.UserName like 'a%'允许在Users表上使用索引(如果存在)。

HTH