【问题标题】:Include ParentId records in SQL在 SQL 中包含 ParentId 记录
【发布时间】:2013-08-02 13:25:41
【问题描述】:

我有下表,其中包含应用程序功能列表:

应用功能

IdNameMenuId

值是:

1PatientSearch2

应用程序菜单

IdDisplayTextUrlParentMenuId

值是

1PatientpatientNULL

2PatientSearchsearch1

我需要获取菜单信息以及功能。到目前为止,我只能获取映射菜单,但不能获取父菜单项。

SELECT
AF.Name, AF.Id As FeatureId, AM.Id AS MenuId, AM.DisplayText,AM.Url
FROM 
ApplicationFeature AF 
INNER JOIN ApplicationMeny AM ON AF.MenuId=AM.Id 

我的结果仅显示 PatientSearch 菜单详细信息,但不包括 Patient Menu。

如何使查询也检索父菜单详细信息?

编辑:

我需要使用 Parent 构建菜单。如果父菜单有另一个父菜单,我也需要包含该菜单。

-- Parent(Id=2)

  --- SubParent(Id=10 & ParentId=2)

    ----ActualMenuMappedwithFeature(Id=30 & ParentId=10)

在上述情况下,我想要菜单 ID 为30, 10, 2的结果

【问题讨论】:

  • 你能在你的帖子中添加一个“正确”的结果吗?
  • @n1ckolas:感谢您的修复 :)
  • 请显示正确的结果

标签: sql sql-server-2008 sql-server-2005 sql-server-2008-r2


【解决方案1】:

嗯,很难说,你想得到什么。但是如果你只想获取一个父母,你可以做额外的加入

select
    AF.Name, AF.Id As FeatureId,
    AM.Id as MenuId, AM.DisplayText, AM.Url,
    AMP.Id as ParentMenuId, AMP.DisplayText as ParentDisplayText, AM.Url as ParentUrl
from ApplicationFeature as AF
    inner join ApplicationMenu as AM on AM.Id = AF.MenuId
    left outer join ApplicationMenu as AMP on AMP.Id = AM.ParentMenuId

如果您想让所有父母都达到顶峰,请说明所需的输出格式
编辑

declare @FeatureId = ???

;with CTE as (
  select
     AF.Name, AF.Id As FeatureId,
     AM.Id as MenuId, AM.DisplayText, AM.Url,
     AM.ParentId
  from ApplicationFeature as AF
     inner join ApplicationMenu as AM on AM.Id = AF.MenuId
  where AF.Id = @FeatureId

  union all

  select
     null as Name, null as FeatureId,
     AM.Id as MenuId, AM.DisplayText, AM.Url,
     AM.ParentId
  from ApplicationMenu as AM
     inner join CTE as C on C.ParentId = AM.Id
)
select * from CTE

【讨论】:

  • 已编辑答案,仍然不明白为什么需要这样的结构,但无论如何,检查一下,可能是我误解了你
【解决方案2】:

更新

需要第二次加入才能得到家长

SELECT AF.ID,
AM.DisplayText as child,
Parent.DisplayText as parent
FROM ApplicationFeature AF 
LEFT JOIN ApplicationMenu AM ON AF.MenuId = AM.Id 
LEFT JOIN ApplicationMenu as Parent on AM.ParentMenuId = Parent.ID

SQLFiddle

结果

【讨论】:

  • 该查询不返回父级:请参阅此fiddle
  • 是的,SQLFiddle 没有正确显示。使它成为 SELECT Parent.* 并且它会起作用。
  • 我没有关注你。
  • SQLFiddle 没有显示父级,因为列名不是唯一的。 'AM' 和 'Parent' 具有相同的列名,因此 SQLFiddle 只显示一次。检查我的小提琴链接
  • 也许我理解错了这个问题。我以为他想要两张唱片,但我不知道。
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2015-03-05
  • 1970-01-01
相关资源
最近更新 更多