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

问题描述 投票:0回答:2

我有下表与子父关系。

身份证 标题 页面ID 是家长 家长ID 处于活动状态
1 仪表板 2125 正确 正确
2 站点分析 22 错误 正确
3 SEO管理 1 正确
4 邮件管理 32 正确
5 构建移动应用程序 3214 正确
6 市场分析 1321 正确
7 定制 235345 正确
8 记者 253 正确
9 编辑器 545 正确
10 新闻模板 45 正确
11 测试菜单 0 正确 3 正确

这里

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
sql sql-server database self-join
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

2
投票

你正在倒退。

  FROM [dbo].[ChildParent] P
  LEFT JOIN [dbo].[ChildParent] C ON P.ParentID = C.ID
© www.soinside.com 2019 - 2024. All rights reserved.