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コードの親のみがテーブルにプリロードされているかのように、テーブルセットを取得します。
この種の結果を得るためにデータをさらに操作する方法についてのアイデアはありますか?
この回答は、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