2016-12-01 41 views
0

我有兩張表,父母和孩子在SQL Server中。在第一個孩子上顯示第一個父代,並將其他顯示爲NULL的孩子顯示爲NULL

父表

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

只是一個小注:這確實氣味像一些東西,通常是在前端處理。儘可能避免在SQL Server上丟失自己的數據格式。 – Jens

+0

SQL Server 2008 R2不再受支持。所有受支持的版本都有一個[hierarchyid](https://msdn.microsoft.com/en-us/library/bb677173.aspx)類型,它可以使定義層次結構和查找父母更爲簡單。該升級到支持的版本了。 BTW SQL Server 2016 SP1即使在Express和LocalDB版本中也提供內存表,壓縮,列存儲和分區。單獨的性能,硬件和許可證節約應該證明遷移的合理性 –

+0

我有一個業務需求來生成一個看起來像這樣的報告。 謝謝你的建議。我會考慮的。 – sovantha

回答

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
;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 
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

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 
相關問題