Порядок SQL запроса по иерархии и случайный код - PullRequest
1 голос
/ 13 марта 2020

Я пытался найти что-то похожее и похожее, но не смог его найти.

Это таблица, которую мне нужно получить в результате:

+-----+-----------+------+-------------------+
| ID  | PARENT_ID | CODE |       NAME        |
+-----+-----------+------+-------------------+
| 218 | NULL      | 1445 | First One         |
| 235 | 218       |    2 | First Child       |
| 247 | 235       |   45 | First Grandchild  |
| 246 | 235       |   55 | Second Grandchild |
| 230 | 218       |    3 | Second Child      |
| 238 | 230       |   12 | Third Grandchild  |
| 231 | 230       |   20 | Fourth Grandchild |
+-----+-----------+------+-------------------+

Порядок должен соответствовать иерархии, за которой следует код. Мне нужно это, чтобы сделать утверждение. И, если это возможно, я хотел бы получить это только с помощью запроса, без метода сортировки этого списка. Вот пример того, что я пытаюсь утверждать: Древовидная иерархия

Что я уже сделал, это следующий рекурсивный запрос:

WITH CTE (ID, PARENT_ID, CODE, NAME)
AS
-- Anchor:
    (SELECT
        ID,
        PARENT_ID,
        CODE,
        NAME
        FROM WAREHOUSE
        WHERE PARENT_ID IS NULL

    UNION ALL 

-- Level:
    SELECT
        W.ID,
        W.PARENT_ID,
        W.CODE,
        W.NAME
        FROM WAREHOUSE AS W
        INNER JOIN CTE
        ON R.PARENT_ID = CTE.ID)

SELECT *
    FROM CTE

Я ценю любую помощь в этом! Заранее спасибо!

1 Ответ

1 голос
/ 13 марта 2020

Похоже, вы можете использовать последовательность [CODE] в пути к иерархии

Пример

Declare @YourTable Table ([ID] int,[PARENT_ID] int,[CODE] varchar(50),[NAME] varchar(50))
Insert Into @YourTable Values 
 (218,NULL,1445,'First One')
,(235,218,2,'First Child')
,(247,235,45,'First Grandchild')
,(246,235,55,'Second Grandchild')
,(230,218,3,'Second Child')
,(238,230,12,'Third Grandchild')
,(231,230,20,'Fourth Grandchild')


;with cteP as (
      Select ID
            ,PARENT_ID 
            ,[Code]
            ,Name 
            ,HierID = convert(hierarchyid,concat('/',[Code],'/'))
      From   @YourTable
      Where  Parent_ID is null
      Union  All
      Select ID  = r.ID
            ,PARENT_ID  = r.PARENT_ID 
            ,r.[Code]
            ,Name   = r.Name
            ,HierID = convert(hierarchyid,concat(p.HierID.ToString(),r.[Code],'/'))
      From   @YourTable r
      Join   cteP p on r.PARENT_ID  = p.ID)
Select Lvl   = HierID.GetLevel()
      ,ID
      ,PARENT_ID
      ,[Code]
      ,Name  
 From cteP A
 Order By A.HierID

Возвращает

Lvl ID  PARENT_ID   Code    Name
1   218 NULL        1445    First One
2   235 218         2       First Child
3   247 235         45      First Grandchild
3   246 235         55      Second Grandchild
2   230 218         3       Second Child
3   238 230         12      Third Grandchild
3   231 230         20      Fourth Grandchild
...