web-dev-qa-db-ja.com

1つのツリーについて、データのツリーが多数あるテーブルをクエリするにはどうすればよいですか?

NAICSスキーマがロードされています があり、すべてが正常に機能しています。しかし、Postgrseqlでどのようにクエリするのか混乱していますか?

テーブルはこんな感じ、

=========NAICS_2012=========
naics | naics_parent | title
----------------------------

これは私が書いたものです、

WITH RECURSIVE search_graph(naics12, naics12_parent, title, depth, path_info) AS (
        SELECT naics12, naics12_parent, title, 1, array[naics12]
        FROM naics.codes
        WHERE naics12_parent IS NULL
UNION ALL
        SELECT c.naics12, c.naics12_parent, c.title, sg.depth+1, sg.path_info||c.naics12
        FROM naics.codes AS c, search_graph AS sg
        WHERE c.naics12_parent = sg.naics12
)
SELECT * FROM search_graph ORDER BY path_info;

これにより、次のような出力が生成されます(必ず最後までスクロールしてください)

 naics12 | naics12_parent |                                                         title                                                          | depth |         path_info          
---------+----------------+------------------------------------------------------------------------------------------------------------------------+-------+----------------------------
 11      |                | Agriculture, Forestry, Fishing and Hunting                                                                             |     1 | {11}
 111     | 11             | Crop Production                                                                                                        |     2 | {11,111}
 1111    | 111            | Oilseed and Grain Farming                                                                                              |     3 | {11,111,1111}
 11111   | 1111           | Soybean Farming                                                                                                        |     4 | {11,111,1111,11111}
 111110  | 11111          | Soybean Farming                                                                                                        |     5 | {11,111,1111,11111,111110}
 11112   | 1111           | Oilseed (except Soybean) Farming                                                                                       |     4 | {11,111,1111,11112}
 111120  | 11112          | Oilseed (except Soybean) Farming                                                                                       |     5 | {11,111,1111,11112,111120}
 11113   | 1111           | Dry Pea and Bean Farming                                                                                               |     4 | {11,111,1111,11113}
 111130  | 11113          | Dry Pea and Bean Farming                                                                                               |     5 | {11,111,1111,11113,111130}
 11114   | 1111           | Wheat Farming                                                                                                          |     4 | {11,111,1111,11114}
 111140  | 11114          | Wheat Farming                                                                                                          |     5 | {11,111,1111,11114,111140}
 11115   | 1111           | Corn Farming                                                                                                           |     4 | {11,111,1111,11115}
 111150  | 11115          | Corn Farming                                                                                                           |     5 | {11,111,1111,11115,111150}
 11116   | 1111           | Rice Farming                                                                                                           |     4 | {11,111,1111,11116}
 111160  | 11116          | Rice Farming                                                                                                           |     5 | {11,111,1111,11116,111160}
 11119   | 1111           | Other Grain Farming                                                                                                    |     4 | {11,111,1111,11119}
 111191  | 11119          | Oilseed and Grain Combination Farming                                                                                  |     5 | {11,111,1111,11119,111191}
 111199  | 11119          | All Other Grain Farming                                                                                                |     5 | {11,111,1111,11119,111199}
 1112    | 111            | Vegetable and Melon Farming                                                                                            |     3 | {11,111,1112}
 11121   | 1112           | Vegetable and Melon Farming                                                                                            |     4 | {11,111,1112,11121}
 111211  | 11121          | Potato Farming                                                                                                         |     5 | {11,111,1112,11121,111211}
 111219  | 11121          | Other Vegetable (except Potato) and Melon Farming                                                                      |     5 | {11,111,1112,11121,111219}
 1113    | 111            | Fruit and Tree Nut Farming                                                                                             |     3 | {11,111,1113}
 11131   | 1113           | Orange Groves                                                                                                          |     4 | {11,111,1113,11131}
 111310  | 11131          | Orange Groves                                                                                                          |     5 | {11,111,1113,11131,111310}

ただし、必要なのは1つのツリーを表示することなので、次のようなクエリを記述できます。

SELECT * FROM search_graph WHERE naics12 = <foo>;

また、提供されたNAICS12コードの親のみがテーブルにプリロードされているかのように、テーブルセットを取得します。

この種の結果を得るためにデータをさらに操作する方法についてのアイデアはありますか?

2
Evan Carroll

この回答は、irc.freenode.net /#postgresqlのRhodiumToad(通常どおり)からのものです。

WITH RECURSIVE search_graph(naics12, naics12_parent, title, depth, path_info) AS (
  SELECT naics12, naics12_parent, title, 1, array[naics12]
  FROM naics.codes
  WHERE naics12 = ?
UNION ALL
  SELECT c.naics12, c.naics12_parent, c.title, sg.depth+1, sg.path_info||c.naics12
  FROM naics.codes AS c
  JOIN search_graph AS sg
    ON ( c.naics12 = sg.naics12_parent )
)
SELECT * FROM search_graph ORDER BY path_info DESC;

基本的には、端末の状態が必要な場合を除いて、大丈夫でした

WHERE naics12 = ?

そして、再帰的な条件は逆に進む必要があります。上からではなく、下から上に行く必要があります。

ON ( c.naics12 = sg.naics12_parent )

いいえ、

WHERE c.naics12_parent = sg.naics12
2
Evan Carroll