显示第一个子节点上的第一个父节点以及具有相同父节点的其余子节点显示为NULL

时间:2016-12-01 08:03:02

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

我在SQL Server中有两个表,Parent和Children。

父表

ParentID    ParentName
----------- ------------------
1           Parent 1
2           Parent 2
3           Parent 3
4           Parent 4
5           Parent 5

儿童表

ChildID     ChildName                           ParentID
----------- ----------------------------------- -----------
1           Child 1                             1
2           Child 2                             1
3           Child 3                             1
4           Child 4                             1
5           Child 5                             2
6           Child 6                             2
7           Child 7                             3
8           Child 8                             3
9           Child 9                             3

如何查询显示第一个子节点上的第一个父节点以及具有相同父节点的其余子节点显示为NULL?

ChildID     ChildName                   ParentName
----------- --------------------------- -----------------
1           Child 1                     Parent 1
2           Child 2                     NULL
3           Child 3                     NULL
4           Child 4                     NULL
5           Child 5                     Parent 2
6           Child 6                     NULL
7           Child 7                     Parent 3
8           Child 8                     NULL
9           Child 9                     NULL

4 个答案:

答案 0 :(得分:1)

尝试以下查询。

SELECT c.ChildId, c.ChildName, p.ParentName    
FROM    (SELECT childId, 
            ChildName, 
            ParentId, 
            Row_number() over(partition by ParentId Order by ParentId asc, ChildID asc) row_num
    FROM Children) c    
LEFT JOIN Parent p 
 ON c.ParentId = p.ParentId
  AND c.row_num = 1;

答案 1 :(得分:1)

;with cte as 
  (
  select  childId, 
            ChildName, ParentName,
            p.ParentId, Row_number() over(partition by p.ParentId Order by p.ParentId asc, ChildID asc) row_num  
  from Table20 a join parent p on a.ParentID=p.ParentID
  )
  select  childId, 
            ChildName, 
              CASE row_num WHEN 1 THEN ParentName ELSE NULL END as parentname from cte

输出

childId ChildName   parentname
1   Child 1 Parent 1
2   Child 2 NULL
3   Child 3 NULL
4   Child 4 NULL
5   Child 5 Parent 2
6   Child 6 NULL
7   Child 7 Parent 3
8   Child 8 NULL
9   Child 9 NULL

答案 2 :(得分:0)

试试这个:

SELECT C.*
      ,IIF(ROW_NUMBER() OVER (PARTITION BY C.[ParenetID] ORDER BY C.[ChildID]) <> 1, NULL, P.[ParentName])
FROM @Children C
INNER JOIN @Parent P
    ON C.[ParenetID] = P.[ParenetID]

完整的工作示例:

DECLARE @Parent  TABLE
(
    [ParenetID] TINYINT
   ,[ParentName] VARCHAR(12)
);


DECLARE @Children  TABLE
(
    [ChildID] TINYINT
   ,[ChildName] VARCHAR(12)
   ,[ParenetID] TINYINT
);


INSERT INTO @Parent ([ParenetID], [ParentName])
VALUES   (1, 'Parent 1')
        ,(2, 'Parent 2')
        ,(3, 'Parent 3')
        ,(4, 'Parent 4')
        ,(5, 'Parent 5');

INSERT INTO @Children ([ChildID], [ChildName], [ParenetID])
VALUES   (1, 'Child 1', 1)
        ,(2, 'Child 2', 1)
        ,(3, 'Child 3', 1)
        ,(4, 'Child 4', 1)
        ,(5, 'Child 5', 2)
        ,(6, 'Child 6', 2)
        ,(7, 'Child 7', 3)
        ,(8, 'Child 8', 3)
        ,(9, 'Child 9', 3);

SELECT C.*
      ,IIF(ROW_NUMBER() OVER (PARTITION BY C.[ParenetID] ORDER BY C.[ChildID]) <> 1, NULL, P.[ParentName])
FROM @Children C
INNER JOIN @Parent P
    ON C.[ParenetID] = P.[ParenetID]

enter image description here

答案 3 :(得分:0)

试试这个

SELECT c.ChildId, c.ChildName, CASE row_num WHEN 1 THEN p.ParentName ELSE NULL END    
(SELECT childId, ChildName, ParentId, 
        Row_number() over(partition by ParentId Order by ParentId asc, ChildID asc) row_num
FROM Children) c    
JOIN Parent p ON c.ParentId = p.ParentId