また質問させて頂きます。宜しくお願いします。

現在添付画像のテーブルイメージのように情報を取得したいのですが、
方法が思い浮かず投稿させていただいています。

取得したい階層のイメージは、添付画像ツリーイメージのようになる事を求めています。

要望としては、
・PostgresSQL8.4で動作可能
・なるべくSQLで解決したい
・SQLのクエリ発行数に関してはなるべく1回が良いですが別に2回以上でも使用可
(ただし、アプリケーション側でループ処理とかは無し。1000回ループとかありえるんで。。。)
・必要ならば一時テーブルの作成もあり


お手数ですが、どなたか方法・アドバイス等お教え頂ければ助かります。

「SQLで階層(ツリー)情報を取得」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (1件)

PostgreSQLの環境がないので試すことができないのですが、


connectby()関数を使ってみてはどうでしょうか。
「PostgreSQL 階層問合せ」などで検索してみるといいと思います。
参考になれば幸いです。

この回答への補足

せっかくご回答して頂いたのに、お礼が遅くなって大変申し訳ございません。
上記回答して頂いた内容を調べてみました。

現在Ver8.4では「WITH RECURSIVE」という処理でわかりやすい文法になってるようですね。
こういう処理自体はじめて知りました。

尚、現状ですがツリーイメージにあります、リーフ(末端)からルート(最上位)までの階層を取得する処理は以下のSQL文で解決しましたが、全てのリーフ(末端)を取得するようなSQLはできませんでした。(もう少しでできそうだったんですが…)

ループで回すしか無いですかね…


--現状のSQL------------------------------------------------------
WITH RECURSIVE rec(階層ID, 階層名, 親階層ID, 末端階層ID) as (

SELECT
階層ID,
階層名,
親階層ID,
'03' AS 末端階層ID ← '03'は末端階層ID(とりあえず末端の'03'を使用)
FROM
階層管理テーブル
WHERE
階層ID = '03'

UNION ALL

SELECT
A.階層ID,
A.階層名,
A.親階層ID,
'03' AS 末端階層ID ← '03'は末端階層ID(とりあえず末端の'03'を使用)

FROM 階層管理テーブル A

INNER JOIN rec
ON A.階層ID = rec.親階層ID

)
SELECT * FROM rec
ORDER BY 親階層ID,
階層ID

-------------------------------------------------------------------

補足日時:2011/05/09 00:24
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qコンピューターの”階層”と”環境”を英語で言うと?

英語でコンピューターのフォルダの“階層”は何といえばいいのでしょうか?
“これらのファイルはXXXと同じ階層に置いてください”というようなことを伝えたいと思っています。 また、上の階層、下の階層はそれぞれ“Upper, Lower”でいいのでしょうか? 2つ上の階層、3つ下の階層はなんと表現すればいいのでしょうか?

もうひとつ、コンピューターの“環境”(OSやハードウェア、使用ソフトなど)は何といえばいいのでしょうか?
“問題がある場合はそちらの環境を教えてください”というようなことを伝えたいと思っています。

よろしくお願いします。

Aベストアンサー

こんにちわ。
ソフトウェア会社でローカライズをしています。私にとっては日常用語の「階層」です。定訳は「hierarchy」です。
今やっているマニュアルにも、hierarchyっていう単語の
オンパレードです。USのライターがhierarchyと表現しているから、これは間違いありません。

上の階層であれば、hierarchy one level up
下の層であれば、hierarchy one level down

と表現したほうがクリアです。階層の深さはマチマチなので、upperやlowerと漠然と表現するよりも、基準の位置からいったいどれくらい離れている階層なのかを明確に数字で表現したほうが読み手にとっても分かりやすいです。

だから、
2つ上の階層であれば、hierarchy two levels up
3つ下の階層であれば、hierarchy three levels down

でいいと思います。

あと「環境」は、日常生活ではenvironmentですが、
コンピュータの世界でも一緒です。コンピュータの世界には、この手の単語がたくさんあります。日常生活で使われている単語なんだけど、特殊な意味を持つものが。

“問題がある場合はそちらの環境を教えてください”は、

If you have any problems, please let us know what environment you are using.

で十分、通じると思います。

以上、ご参考になればと思います。

こんにちわ。
ソフトウェア会社でローカライズをしています。私にとっては日常用語の「階層」です。定訳は「hierarchy」です。
今やっているマニュアルにも、hierarchyっていう単語の
オンパレードです。USのライターがhierarchyと表現しているから、これは間違いありません。

上の階層であれば、hierarchy one level up
下の層であれば、hierarchy one level down

と表現したほうがクリアです。階層の深さはマチマチなので、upperやlowerと漠然と表現するよりも、基準の位置からいったいどれくらい離...続きを読む

QPostgresSQL8.4でツリー上に取得したい

PostgresSQL8.4でツリー上に取得したい
こんにちわ。
PostgresSQLでツリー上にデータを取得したいのですが、思ったように取得できないのでご教授をお願いします画像の「取得したい順番」。
データはid,name,parentとの構造になっています。
データは親子構造になっており、親の下に子が並ぶようにしたいんです。
子は親のidをparentに持っています。
元のデータは画像の「元データ」になっています。
現状再起SQLでデータを取得しid or parentでソートを掛けているのですが、意図した通りに取得できません画像の「取得出来る順番」。
そもそも再起SQLでできるのか、相関サブクエリを使うのか・・・SQLのみでできるのかすら分からなくなってきました・・・。
何か画像の「取得したい順番」通りに取得する方法はないでしょうか。
ヒントだけでもいいので、ご教授をお願いします。

Aベストアンサー

#1 です。

余計なお世話かもしれませんが、親子関係で階層的にデータを持たせるのは、主たる要素の意味合いの粒度が同じ場合の方が好ましいです。

例えば、前便のサンプルで頻出する社員テーブルの場合、主キーは社員ID、エンティティの意味する粒度は親でも子でも変わらない「社員」です。

ご質問の場合、アジア→日本→東京(地域→国名→地名)のように粒度が荒いので、マスタとして今後、使いにくくなっていく可能性があります。

既に設計済みでもう変えられないなら、仕方ありませんが。

また、単純に地名マスタ程度の意味合いしかないのであれば、今のままでも問題無いと思います。

Q【英語】webページの「第二階層」

webページの「第二階層」て何て言うのがふさわしいですか?
two level
second class
・・

色々調べたのですが分からず、教えていただきたくお願いします!

Aベストアンサー

添付辞書の用例で


a second directory hierarchy

•The second directory belongs to a second directory hierarchy which is lower hierarchy than the first directory hierarchy.

第2ディレクトリは、第1ディレクトリ階層よりも下位の第2ディレクトリ階層に属する。


http://www.sophia-it.com/content/%E9%9A%8E%E5%B1%A4%E5%9E%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0

参考URL:http://ejje.weblio.jp/content/directory+hierarchy

Q1回のSQL文で取得できますか

Postgresでテーブルが2つある場合、
その2つに登録されているデータを全て取得したいのです。
例えば
Aテーブル       Bテーブル
Key1 key2 A     Key1 key2 B
---------- ---------
01 01 A1    
01 02 A2   01 02 B2
01 03 A3   01 03 B3
            01 04 B4
とある場合、
1度のSQLで下のような結果を取得できますか?
Key1 key2 A   B
------------
01 01 A1   NULL
01 02 A2   B2
01 03 A3   B3
01 04 NULL  B4

お願いいたします。

Aベストアンサー

SELECT * FROM Aテーブル LEFT JOIN Bテーブル USING("Key1", "Key2")
UNION
SELECT * FROM Aテーブル RIGHT JOIN Bテーブル USING("Key1", "Key2")

で取得できるでしょう。

Q英語マニュアルの表現を教えてください

英語マニュアルで、なんて書いてありますか?

Explorerで目的のファイルに階層をたどって行く操作を、ドリルダウンって表現使いますか?

ドロップダウンでしょうか・・・・


どの様に記述されているか教えて下さい。

Aベストアンサー

Drill down until you get to this location: [ディレクトリ]

または

Click to drill down to display [ファイル名].

とかを使うこともあるようです。
きりで穴を開けていく感覚、かなと思います。

選択しなくても次にクリックする場所が操作者にわかっている時のみ使えますので
マニュアルでは「ここをクリックして」「次にここをクリックして」などのように、その都度指示をする方が多いと思います。

Q日付により変動する「単価」を取得するSQLを教えてください

PostgreSQL + PHP による Web アプリケーションを開発しています。

ある日付時点での各商品単価が取得できるSQLを考えていますが良い考えが浮かびません。
たとえば、以下のように2009年11月18日時点での価格一覧が取得できないでしょうか?

牛丼(小)300円
牛丼(並)350円
牛丼(大)470円
サラダA 200円
サラダB 205円
サラダ盛合せ 498円

テーブル設計に問題があるのかもしれませんが...

テーブル設計は以下のとおりです。
ブラウザによっては崩れて読みにくいかもしれません、ご容赦ください。

■商品マスタ
┏━━━━┳━━━━━━━┳━━━━━━━┓
┃商品ID  ┃ 商品詳細ID  ┃   商品名   ┃
┃      1┃         200┃牛丼(小)    ┃
┃      1┃         300┃牛丼(並)    ┃
┃      1┃         500┃牛丼(大)    ┃
┃      2┃           1┃サラダA   ┃
┃      2┃           2┃サラダB   ┃
┃      2┃           3┃サラダ盛合せ  ┃
┗━━━━┻━━━━━━━┻━━━━━━━┛

■商品価格
┏━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━┓
┃商品ID  ┃ 商品詳細ID  ┃   単価適用日   ┃   単価  ┃
┃      1┃         200┃      2009-10-01┃       300┃
┃      1┃         200┃      2009-11-30┃       280┃
┃      1┃         200┃      2010-02-05┃       320┃
┃      1┃         300┃      2009-10-01┃       350┃
┃      1┃         300┃      2009-11-20┃       370┃
┃      1┃         300┃      2010-03-01┃       380┃
┃      1┃         500┃      2009-09-30┃       500┃
┃      1┃         500┃      2009-10-15┃       470┃
┃      2┃           1┃      2009-10-01┃       180┃
┃      2┃           1┃      2009-10-18┃       200┃
┃      2┃           2┃      2009-09-05┃       210┃
┃      2┃           2┃      2009-09-20┃       205┃
┃      2┃           2┃      2010-02-02┃       170┃
┃      2┃           3┃      2009-09-01┃       480┃
┃      2┃           3┃      2009-09-15┃       500┃
┃      2┃           3┃      2009-11-02┃       498┃
┃      2┃           3┃      2010-01-20┃       470┃
┗━━━━┻━━━━━━━┻━━━━━━━━━┻━━━━━━┛

長文すみません、よろしくお願いいたします。

PostgreSQL + PHP による Web アプリケーションを開発しています。

ある日付時点での各商品単価が取得できるSQLを考えていますが良い考えが浮かびません。
たとえば、以下のように2009年11月18日時点での価格一覧が取得できないでしょうか?

牛丼(小)300円
牛丼(並)350円
牛丼(大)470円
サラダA 200円
サラダB 205円
サラダ盛合せ 498円

テーブル設計に問題があるのかもしれませんが...

テーブル設計は以下のとおりです。
ブラウザによっては崩れて読みにくいかもしれません、ご容...続きを読む

Aベストアンサー

単価適用日のカラクリを考えると、指定日以前で最大の日付と一致する
データが対象となるようですね。
SELECT A.商品名,B.単価 FROM
商品マスタ A LEFT JOIN
(SELECT X.* FROM 商品価格 X LEFT JOIN
(SELECT 商品ID,商品詳細ID,MAX(単価適用日) 適用日 FROM 商品価格
WHERE 単価適用日<='2009-11-18' GROUP BY 商品ID,商品詳細ID) Y
ON X.商品ID=Y.商品ID AND X.商品詳細ID=Y.商品詳細ID
AND X.単価適用日=Y.適用日) B
ON A.商品ID=B.商品ID AND A.商品詳細ID=B.商品詳細ID

Qページ丸ごと保存するソフトの設定にある「階層」とは?

Gethtmlや巡集などのソフトの設定にある「階層」の意味が分りません。
1階層、2階層、3階層・・・と階層を増やしていくと具体的になにが変わってくるのでしょうか。漠然と階層を増やすとダウンロードするファイル数が増えるのは分るのですが

1階層、テキスト
2階層、画像  

とかでは無いですよね?

Aベストアンサー

No2です。

> / (区切り)を1階層と考えていいでしょうか
多くの単純なHPだと、そう考えていいです。

ただし、保存ソフトの使い方という面から見ると注意が必要です。
現在のページのリンク先にある、ファイルをターゲットとする場合、
リンク先自体、1階層下にあると、考えてください。

中には、プログラムで他のサーバーから、ファイルを呼び出している場合もあります。
その場合は、階層外となり、保存ソフトでは、ダウンロードできなかったはずです。
(最後の部分は、最近の保存ソフトを使ってないので、追跡機能があるかどうか自信有りません)

Qリストを出力する際にSQLでデータの取得をする際に全く分からないことがあります。 2つのテーブルと1

リストを出力する際にSQLでデータの取得をする際に全く分からないことがあります。

2つのテーブルと1つのマスタがあり、リストを出力するときの項目となる部分に

ssql = A_TB.○○
ssql= A_TB.××
ssql= B_TB.**
ssql= B_TB.☆☆
ssql= A_TB.♪♪
ssql= C_MT.〒〒
ssql= A_TB.々々

のようにselectで各項目となる各テーブル、マスタのカラムを代入しています。

このときのformはどうなりますか?

Aベストアンサー

No.1ですが、回答に対していただきましたご質問にお答えします。

>> selectで指定したカラムのテーブルをいくつか取り出す場合

取り出されるデータは、レコードごとの行、カラムごとの列で形成される二次元の表形式ですから、
これは、取り出したデータがどのような表になるか、具体的に想像すれば、お判りでしょう。

仮にA_TBに、
商品名、顧客名, 数量、金額を表すカラムがあり、
商品A, Aさん, 10, 1000
商品B, Bさん, 20, 2000
商品C, Aさん, 30, 3000
とデータが格納されていて、

C_MTに、
顧客名、顧客住所を表すカラムがあり、
Aさん, 東京都
Bさん, 埼玉県
とデータが格納されているとします。

"SELECT * FROM A_TB, C_MT"
と、JOINを用いなければ、
A_TBの各レコードに対して、C_MTの全てのレコードが結合された、異常に膨大なデータ(直積)が取り出されます。
これを交差結合(Cross Join)と言います。

結果
商品A, Aさん, 10, 1000, Aさん, 東京都
商品A, Aさん, 10, 1000, Bさん, 埼玉県
商品B, Bさん, 20, 2000, Aさん, 東京都
商品B, Bさん, 20, 2000, Bさん, 埼玉県
商品C, Aさん, 30, 3000, Aさん, 東京都
商品C, Aさん, 30, 3000, Bさん, 埼玉県

これに対し、SQLのきちんとした文法を用いて、
SELECT * FROM A_TB INNER JOIN C_MT ON A_TB.顧客氏名 = C_MT.顧客氏名
と書けば、
上記の交差結合の結果のうち、A_TB.顧客氏名 = C_MT.顧客氏名の部分だけ取り出されます。

結果
商品A, Aさん, 10, 1000, Aさん, 東京都
商品B, Bさん, 20, 2000, Bさん, 埼玉県
商品C, Aさん, 30, 3000, Aさん, 東京都

>> なんのテーブルのどこのカラムかというのを指定してひとつの変数に各カラムを代入してもそれだけでは無意味

おっしゃる通り、無意味です。
前の回答にも書きましたが、基本的には、
一つの変数に、全ての句のSQL文をつなげて文字列として代入し、これを引数として受け取る何らかの関数で実行します。

No.1ですが、回答に対していただきましたご質問にお答えします。

>> selectで指定したカラムのテーブルをいくつか取り出す場合

取り出されるデータは、レコードごとの行、カラムごとの列で形成される二次元の表形式ですから、
これは、取り出したデータがどのような表になるか、具体的に想像すれば、お判りでしょう。

仮にA_TBに、
商品名、顧客名, 数量、金額を表すカラムがあり、
商品A, Aさん, 10, 1000
商品B, Bさん, 20, 2000
商品C, Aさん, 30, 3000
とデータが格納されていて、

C_MTに、
顧客名、顧客...続きを読む

QSDカードの階層について

 カーナビでSDカードに取り込んだ音楽再生ができません。4階層ではなく、3階層を指定してあげれば良いということですが、階層ってなんですか?階層はどのように表示、変更ができますか?教えてください。

Aベストアンサー

階層というのはフォルダー構造のことです。
何もフォルダーが作られていない状態のとき1階層でここを特にルートと呼びます。

ルートに作られたフォルダーの中が2階層目。
2階層目のフォルダの中に作られたフォルダーの中が3階層目。
以下どんどん深くフォルダーをツリー状に作成していけます。

Qtutorial/funcs.sqlの中のSQL文

の中に

CREATE TABLE EMP (
name text,
salary integer,
age integer,
cubicle point
);

INSERT INTO EMP VALUES ('Sam', 1200, 16, '(1,1)');
INSERT INTO EMP VALUES ('Claire', 5000, 32, '(1,2)');
INSERT INTO EMP VALUES ('Andy', -1000, 2, '(1,3)');
INSERT INTO EMP VALUES ('Bill', 4200, 36, '(2,1)');
INSERT INTO EMP VALUES ('Ginger', 4800, 30, '(2,4)');

-- the argument of a function can also be a tuple. For instance,
-- double_salary takes a tuple of the EMP table

CREATE FUNCTION double_salary(EMP) RETURNS integer
AS 'SELECT $1.salary * 2 AS salary' LANGUAGE SQL;

SELECT name, double_salary(EMP) AS dream
FROM EMP
WHERE EMP.cubicle ~= '(2,1)'::point;

というコードが有るのですが
最後のWHERE EMP.cubicle ~= '(2,1)'::pointの
~=
はどういうもので
どんなときにつかうのでしょうか?
また単なる
=
ではエラーになるようなのですが=との使い分けはどのようにすれば良いのでしょうか?

よろしくお願いします

の中に

CREATE TABLE EMP (
name text,
salary integer,
age integer,
cubicle point
);

INSERT INTO EMP VALUES ('Sam', 1200, 16, '(1,1)');
INSERT INTO EMP VALUES ('Claire', 5000, 32, '(1,2)');
INSERT INTO EMP VALUES ('Andy', -1000, 2, '(1,3)');
INSERT INTO EMP VALUES ('Bill', 4200, 36, '(2,1)');
INSERT INTO EMP VALUES ('Ginger', 4800, 30, '(2,4)');

-- the argument of a function can also be a tuple. For i...続きを読む

Aベストアンサー

~= は幾何データ型の演算子で、位置や形が同じかどうかの比較になります。
幾何データ型の = は面積が同じかどうかの比較になります。

point 型は平面における座標「点」なので、面積を持たないから = が
使えないのではないかと思います。


幾何関数と演算子
http://www.postgresql.jp/document/pg904doc/html/functions-geometry.html

> "同じを示す"~=演算子はpoint、box、polygon、およびcircle型に対し通常の等価概念を示すことに注意してください。
> これらのいくつかの型は=演算子を持ちますが、=は面積の等しさのみを比較します。
> その他のスカラー比較演算子(<=など)は同様にこれらの型の面積を比較します。

幾何データ型
http://www.postgresql.jp/document/pg904doc/html/datatype-geometric.html


人気Q&Aランキング