我正在尝试查找其父级具有来自不同关系表的某些特定信息的子级。 我有四个表,如下所示
搜索条件:获取所有父级为“广告资源”级别的“部分”,附加的用户名包含“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
我需要找到符合上述条件的所有部分。 请帮帮我。
答案 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