0

次のように、クエリ テーブルを階層順にソートすることは可能ですか。

期待される

+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 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

SQL Server を使用してデータを生成しています。

4

1 に答える 1

0

実際の問題は、データを階層順にクエリする方法です。これは再帰クエリを使用して可能ですが、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親/子データからデータを入力する方法を示しています。

于 2019-10-04T09:17:48.680 に答える