我在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
答案 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]
答案 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