2015-03-25 2 views
1

У меня есть эта таблица в моей базе данных SQL Server.SQL: сортировка дочерних строк под родительской строкой

MenuID MenuText ParentMenu  MenuOrder  MenuLevel 
------------------------------------------------------------- 
1 Home    0    1    0 
2 Administrator  0    2    0 
3 Groups    2    1    1 
4 Users    2    2    1 
5 Permissions   2    3    1 
6 Test Level2   3    1    2 
7 Test Level3   6    1    3 

Я хочу, чтобы отсортировать эти строки таблицы, как это:

  • Home, Administrator являются MenuLevel 0 штук.
  • Элементы MenuLevel 1 будут находиться под его меню верхнего уровня в соответствии с их столбцом ParentMenu, который указывает на родителя MenuID. Детские предметы будут отсортированы в соответствии с их столбцом MenuOrder.

Я пробовал так много вещей, но не мог понять, как это будет сделано с помощью запроса.

+0

Просьба включить ожидаемый результат. –

+1

Общие выражения таблицы (CTE) будут делать то, что вы хотите. – Paddy

ответ

1

Попробуйте это:

SQL Fiddle

;WITH Cte AS(
    SELECT *, 
     DisplayOrder = CAST(ROW_NUMBER() OVER(PARTITION BY ParentMenu ORDER BY MenuOrder) AS VARCHAR(MAX)) 
    FROM Test 
    WHERE 
     ParentMenu = 0 
    UNION ALL 
    SELECT 
     t.MenuID, 
     t.MenuText, 
     t.ParentMenu, 
     t.MenuOrder, 
     t.MenuLevel, 
     DisplayOrder = c.DisplayOrder + CAST(ROW_NUMBER() OVER(PARTITION BY t.ParentMenu ORDER BY t.MenuOrder) AS VARCHAR(MAX)) 
    FROM Cte c 
    INNER JOIN Test t 
     ON c.MenuID = t.ParentMenu 
) 
SELECT 
    MenuID, 
    MenuText, 
    ParentMenu, 
    MenuOrder, 
    MenuLevel 
FROM cte 
ORDER BY DisplayOrder 

Результат:

| MenuID |  MenuText | ParentMenu | MenuOrder | MenuLevel | 
|--------|---------------|------------|-----------|-----------| 
|  1 |   Home |   0 |   1 |   0 | 
|  2 | Administrator |   0 |   2 |   0 | 
|  3 |  Groups |   2 |   1 |   1 | 
|  6 | Test Level2 |   3 |   1 |   2 | 
|  7 | Test Level3 |   6 |   1 |   3 | 
|  4 |   Users |   2 |   2 |   1 | 
|  5 | Permissions |   2 |   3 |   1 | 
+0

Спасибо, брату ,,, он работал хорошо :) –

Смежные вопросы