Таблица сортировки в иерархическом порядке - PullRequest
0 голосов
/ 04 октября 2019

Можно ли отсортировать таблицу запросов в иерархическом порядке следующим образом:

Ожидается

+----+--------+-----------+-------+--------+-----------+-----------+---------+
| ID | Code   |  Name     | Qty   | Amount | is_parent | parent_id | remarks |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 1  | ABC    | Parent1   |  2    | 1,000  |     1     |     0     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 4  | FFLK   | Product Z |  10   | 2,500  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 5  | P6DT   | Product 5 |  7    | 1,700  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 6  | P2GL   | Product T |  5    | 1,100  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 2  | DHG    | Parent2   |  5    | 1,500  |     1     |     0     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 3  | LMSJ   | Product U |  4    | 600    |     0     |     2     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+

Это исходная таблица данных:

+----+--------+-----------+-------+--------+-----------+-----------+---------+
| ID | Code   |  Name     | Qty   | Amount | is_parent | parent_id | remarks |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 1  | ABC    | Parent1   |  2    | 1,000  |     1     |     0     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 2  | DHG    | Parent2   |  5    | 1,500  |     1     |     0     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 3  | LMSJ   | Product U |  4    | 600    |     0     |     2     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 4  | FFLK   | Product Z |  10   | 2,500  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 5  | P6DT   | Product 5 |  7    | 1,700  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 6  | P2GL   | Product T |  5    | 1,100  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+


is_parent column = 1 if data row set to parent, 0 if data row set to child 
parent_id column = 0 if data row set to parent, depend on ID of parent data

I 'используя SQL Server для генерации данных.

1 Ответ

0 голосов
/ 04 октября 2019

Похоже, что реальный вопрос заключается в том, как запросить данные в иерархическом порядке. Это возможно при использовании рекурсивных запросов , но более быстрой альтернативой является использование поддержки SQL Server для иерархических данных .

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

WITH h AS
(
      SELECT
             ID,Code,Name,Qty,Amount,is_parent,parent_id,remarks
      FROM
            dbo.ThatTable
      WHERE 
            parent_id=0
      UNION ALL 
      SELECT
             c.ID,c.Code,c.Name,c.Qty,c.Amount,c.is_parent,c.parent_id,c.remarks
      FROM
            dbo.ThatTable c
      INNER JOIN h ON 
            c.parent_id= h.Id
)
SELECT * FROM h

Производительность этого запроса будет приемлемой, если поля ID и Parent_ID проиндексированы, ноне очень.

Добавление поля hierarchyid в таблицу сделает запрос проще и намного быстрее. Предполагая, что есть поле hierarchy, запрос будет просто:

SELECT *
FROM ThatTable
ORDER BY hierarchy

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

В статье Урок 1. Преобразование таблицы в иерархическую структуру показано, как создать новую таблицу с hierarchyid и заполнить ее из родительских / дочерних данных.

...