npdev13 Ответов: 2

Как сделать SQL запрос для получения родительских дочерних данных в группе


Привет,

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

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


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

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


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

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

Что я уже пробовал:

Я пытаюсь использовать

SELECT	ROW_NUMBER() OVER(PARTITION BY [ParentId] ORDER BY  [CustomerName] ASC) AS [R],[CustomerId],[ParentId],[CustomerName] FROM	[Customer] Order by [R],[ParentId]

Но не понимаю, как именно это использовать

2 Ответов

Рейтинг:
2

Wendelius

Один из способов-использовать общее табличное выражение. Используя иерархический запрос, включите в результат самый верхний Родительский идентификатор и используйте его в качестве основного поля сортировки.

Например что-то вроде

WITH 
CustCTE (CustId, CustName, ParentId, UltimateParent) AS (
   SELECT t1.CustId, 
          t1.CustName, 
          t1.ParentId, 
          t1.CustId
   FROM  Customer t1
   WHERE ParentId = 0
   UNION ALL 
   SELECT t2.CustId, 
          t2.CustName, 
          t2.ParentId, 
          cte.UltimateParent
   FROM CustCTE  cte,
        Customer t2
   WHERE t2.ParentId = cte.CustId
)
SELECT cte.CustId, 
       cte.CustName, 
       cte.ParentId
FROM CustCTE cte
ORDER BY cte.UltimateParent, 
         cte.ParentId


npdev13

спасибо за ваше решение, да, оно будет работать, но я не хочу использовать CTE.

Решение, которое я ставлю, - это то, что я хочу.

Wendelius

Если вы можете иметь только один уровень в данных, то простого порядка будет достаточно. Если у вас есть два или более уровней, то вам нужна рекурсия.

Рейтинг:
0

npdev13

Я нашел решение

Порядок по случаю, когда ParentId = 0, то CustID ELSE ParentId END ASC
, Случай, когда ParentId = 0, ТО '0' ELSE CustName END ASC