如何在SQL Server中使用自连接将子父映射到单个表中?

3

我有一个包含子父关系的表格。

ID      Title               PageID  IsParent    ParentID    IsActive
1       Dashboard           2125    True        NULL        True
2       Site Analytics      22      False       NULL        True
3       SEO Management      1       NULL        NULL        True
4       Mail Management     32      NULL        NULL        True
5       Build Mobile App    3214    NULL        NULL        True
6       Market Analytics    1321    NULL        NULL        True
7       Customize           235345  NULL        NULL        True
8       Reporter            253     NULL        NULL        True
9       Editor              545     NULL        NULL        True
10      News Template       45      NULL        NULL        True
11      Test Menu           0       True        3           True
NULL    NULL                NULL    NULL        NULL        NULL

这里的ParentID定义了父子关系。例如,在上面的表格中,测试菜单(Test Menu)网站分析(Site Analytics)的子级。下面是我的SQL查询语句。

SELECT
        P.ID
        ,P.Title AS Parent
        ,C.Title AS Child
        ,P.PageID
        ,P.IsParent
        ,P.ParentID
        ,P.IsActive
      FROM [dbo].[ChildParent] P
      LEFT JOIN [dbo].[ChildParent] C ON P.ID = C.ParentID

以下是输出结果。
1   Dashboard           NULL            2125    1       NULL    1
2   Site Analytics      NULL            22      0       NULL    1
3   SEO Management      Test Menu       1       NULL    NULL    1
4   Mail Management     NULL            32      NULL    NULL    1
5   Build Mobile App    NULL            3214    NULL    NULL    1
6   Market Analytics    NULL            1321    NULL    NULL    1
7   Customize           NULL            235345  NULL    NULL    1
8   Reporter            NULL            253     NULL    NULL    1
9   Editor              NULL            545     NULL    NULL    1
10  News Template       NULL            45      NULL    NULL    1
11  Test Menu           NULL            0       1       3       1

基本上,我想要实现的是:
1   Dashboard           NULL            2125    1       NULL    1
2   Site Analytics      NULL            22      0       NULL    1
3   SEO Management      NULL            1       NULL    NULL    1
4   Mail Management     NULL            32      NULL    NULL    1
5   Build Mobile App    NULL            3214    NULL    NULL    1
6   Market Analytics    NULL            1321    NULL    NULL    1
7   Customize           NULL            235345  NULL    NULL    1
8   Reporter            NULL            253     NULL    NULL    1
9   Editor              NULL            545     NULL    NULL    1
10  News Template       NULL            45      NULL    NULL    1
11  Test Menu           SEO Management  0       1       3       1
2个回答

3

尝试在你的查询中做出这个小改变:

SELECT
        P.ID
        ,P.Title AS Parent
        ,C.Title AS Child
        ,P.PageID
        ,P.IsParent
        ,P.ParentID
        ,P.IsActive
      FROM [dbo].[ChildParent] P
      LEFT JOIN [dbo].[ChildParent] C ON isnull(P.ParentID, P.ID)  = c.id and C.ParentID is not null

@KiranShahi: 你能提供更多细节吗?它给出了什么不同的结果? - Niranjan Rajawat
这将返回所有子列为NULL。 - Kiran Shahi
@KiranShahi 不应该。根据您在问题中提供的数据,它应该显示子行中的一行,即“SEO管理”。 - Niranjan Rajawat

2
你做反了。
  FROM [dbo].[ChildParent] P
  LEFT JOIN [dbo].[ChildParent] C ON P.ParentID = C.ID

这里有一个小细节,如果你在WHERE子句中过滤了Parent,但Child没有被包含进来,那么这个JOIN就不会起作用。条件语句需要反过来写,即P.ID = C.ParentID。 - Craig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接