2016-12-01 1 views
0

У меня есть две таблицы, родители и дети на SQL Server.Отобразить первый родительский элемент для первого дочернего элемента, а остальные дети с одним и тем же родительским отображением, как 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