2017-12-03 76 views
1

我有以下表格与子女父母的关系。如何在SQL Server中使用self Join来在单个表上映射子父项?

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定义了父母和孩子之间的关系。例如,在上面的表测试菜单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 

回答

1

你向后做。

FROM [dbo].[ChildParent] P 
    LEFT JOIN [dbo].[ChildParent] C ON P.ParentID = C.ID 
1

在查询试试这个小变化:

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 
+0

此查询不工作,因为我期望:) –

+0

@KiranShahi:你能提供更多的细节?它给了多少不同的结果? –

+0

这将返回所有子列NULL –

相关问题