Как сделать SQL-запрос для получения родительских дочерних данных в группе - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть одна таблица клиентов, и у меня есть родительский и вспомогательный клиенты в одной таблице с отношением поля "ParentId". Таблица как ниже.

CustId      CustName    ParentId
----------------------------------
1           Cust1         0 
2           Cust2         0
3           Sub2Cust1     1
4           Cust3         0
5           Sub1Cust1     1
6           Sub1Cust2     2
7           Sub2Cust2     2
8           Sub4Cust1     1
9           Sub1Cust3     4
10          Sub3Cust1     1

То, что я хочу, это из MS SQL Query, чтобы он сохранял родительские и дочерние записи вместе, как вывод, как показано ниже:

CustId      CustName    ParentId
----------------------------------
1           Cust1          0 
5           Sub1Cust1      1
3           Sub2Cust1      1
10          Sub3Cust1      1
8           Sub4Cust1      1
2           Cust2          0
6           Sub1Cust2      2
7           Sub2Cust2      2
4           Cust3          0
9           Sub1Cust3      4

Кто-нибудь может подсказать, как это сделать с помощью одного запроса?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

На основании вашего комментария вам может понадобиться рекурсивный CTE.

Технически НЕ один запрос, но он будет поддерживать переменную глубину и желаемую сортировку

Пример

;with cteP as (
      Select CustId
            ,ParentId 
            ,CustName 
            ,PathStr = cast(CustName as varchar(max))
      From   YourTable 
      Where  ParentId=0
      Union  All
      Select CustId  = r.CustId
            ,ParentId  = r.ParentId 
            ,CustName   = r.CustName
            ,HierID = P.PathStr+'>'+r.CustName
      From   YourTable r
      Join   cteP p on r.ParentId  = p.CustId )
Select CustId
      ,CustName 
      ,ParentId
 From cteP A
 Order By A.PathStr

Возвращает

CustId  CustName    ParentId
1       Cust1       0
3       Sub1Cust1   1
5       Sub2Cust1   1
8       Sub3Cust    1
10      Sub4Cust1   1
2       Cust2       0
6       Sub1Cust2   2
7       Sub2Cust2   2
4       Cust3       0
9       Sub1Cust3   4
0 голосов
/ 27 апреля 2018
ORDER BY CASE  WHEN ParentId = 0 THEN CustID ELSE ParentId END ASC
,  CASE WHEN ParentId = 0 THEN 0 ELSE CustId END ASC  --to put the parent on top of the children, and keep the children in order

Чтобы упорядочить детей по имени, а не по идентификатору, просто сделайте это вместо:

ORDER BY CASE  WHEN ParentId = 0 THEN CustID ELSE ParentId END ASC
,  CASE WHEN ParentId = 0 THEN '0' ELSE CustName END ASC  --to put the parent on top of the children, and keep the children in order
...