2017-03-16 38 views
0

ModuleUserPermission是我從哪裏獲取特定用戶的模塊ID以及在模塊表中查詢的主表我在這裏得到的菜單ID查詢菜單表的問題是模塊表只包括終點菜單的id,我想所有的家長以及從終點Id到所有父母的遞歸查詢應該被選中

select * 
      from [ModuleUserPermission] mup 
      inner join Module ml on ml.Id = mup.Module_Id   
      --inner join Menu m on m.Id = ml.Menu_Id and m.IsActive = 1 
      where (NULLIF(@AspNetUsers_Id,'') IS NULL OR mup.AspNetUsers_Id = @AspNetUsers_Id) 

enter image description here

SOLUTION: 這是我做的,我們能做到這一點的正確方法?

DECLARE @TblTemp TABLE(
    Id int, 
    ParentId int, 
    Name nvarchar(max), 
    Url nvarchar(max) NULL, 
    SortOrder int, 
    IconClass nvarchar(max) NULL, 
    IsActive bit 
); 



;With temp as ( 
      select distinct m.* 
       from [ModuleUserPermission] mup 
       inner join Module ml on ml.Id = mup.Module_Id   
       inner join Menu m on m.Id = ml.Menu_Id and m.IsActive = 1 
      where (NULLIF(@AspNetUsers_Id,'') IS NULL OR mup.AspNetUsers_Id = @AspNetUsers_Id) 

     union all 

     select m.* 
      from Menu m  
      inner join temp r on r.ParentId = m.Id 
     where m.IsActive = 1 
    ) 
    INSERT INTO @TblTemp select * from temp 

;With relation (Id, IconClass,SortOrder, ParentId, Name,Url,IsActive, [Level], [OrderSequence]) 
    as 
    ( 
     select distinct m.Id, m.IconClass,m.SortOrder, m.ParentId, m.Name,ISNULL(m.Url,'') Url,m.IsActive, 1, cast(m.Id as varchar(20)) 
     from @TblTemp m where m.ParentId = 0 

     union all 

     select p.Id, p.IconClass,p.SortOrder, p.ParentId,p.Name,p.Url,p.IsActive, r.[Level]+1, cast(r.orderSequence + '_' + cast(p.Id as varchar) as varchar(20)) 
     from @TblTemp p 
     inner join relation r on p.ParentId = r.Id 

    ) 
select * from relation order by OrderSequence 
+0

你能否請提供表結構和樣本數據以及您想要的輸出? –

+0

@StefanoZanini我已更新帖子,請參閱 – Mike

+0

請將您的結構和樣本數據以適當格式的文本發佈,因爲如果您發佈圖片,則此問題將無法正確編入索引。這一點以及圖像鏈接可能會中斷的事實使得這個問題更加嚴重,對未來可能面臨同樣問題的用戶來說,這個問題的答案會變得不那麼有用。 –

回答

0

由於頂級菜單項和下級項目之間的關係在ParentId列描述,你需要自己加入您的Menu表,就像這樣:

select coalesce(m2.Id, m1.Id), coalesce(m2.Name, m1.Name) 
from [ModuleUserPermission] mup 
join Module ml on ml.Id = mup.Module_Id   
join Menu m on m.Id = ml.Menu_Id and m.IsActive = 1 
left join Menu m2 on m.Id = m2.ParentId and m2.IsActive = 1 
where (NULLIF(@AspNetUsers_Id,'') IS NULL OR mup.AspNetUsers_Id = @AspNetUsers_Id) 

left join是因爲頂級物品將不會與任何其他物品一起使用,因此使用inner join時,您將失去它們。這樣你保留它們,但與null s,因此​​3210 s