再帰的にデータを取得する方法について質問させて下さい。
以下のような「TABLE1」と「TABLE2」があった場合に、

TABLE1
------------------------
| ID | AID | JOB |
------------------------
|  1|   10| XXXXX|
------------------------

TABLE2
-------------------------
| ID | PID | NAME |
-------------------------
|  10|  100|   aaa|
|  100| 1000|   bbb|
| 1000| 10000|   ccc|
--------------------------

再帰的に取得したい親階層が2つまで等分かっている場合に、以下のような結果を1度のSQLで取る事は可能でしょうか?

----------------------------------------------------------------------
|ID|AID|JOB |AID_NAME|AID_PID_1|AID_PID_NAME_1|AID_PID_2|AID_NAME_2|
----------------------------------------------------------------------
|1| 10|HIRA |     aaa|    100|        bbb|   1000|      ccc|
----------------------------------------------------------------------

また、上記の結果が取得可能な場合にパフォーマンス的には1度で取得した方が良いのでしょうか?
それともTABLE2の親階層を再帰的に取得するSQLは分割した方が良いのでしょうか?

どうかご教授のほどお願い致します。

A 回答 (1件)

取得できるかといえば、以下のようなクエリで可能です。



SELECT
a.ID ID,
a.AID AID,
a.JOB JOB,
b1.PID AID_PID_1,
b2.NAME AID_NAME_1,
b2.PID AID_PID_2,
b3.NAME AID_NAME_2
FROM TABLE1 a
INNER JOIN TABLE2 b1 ON b1.ID=a.AID
INNER JOIN TABLE2 b2 ON b2.ID=b1.PID
INNER JOIN TABLE2 b3 ON b3.ID=b2.PID

複数回クエリを実行するオーバーヘッドの方が高いと思います。
一発で取ってかまわないでしょう。
気になるならTABLE2のPIDにもインデックスを張ってください。
    • good
    • 0
この回答へのお礼

jamshid6さん

無事に取得する事が出来ました。
パフォーマンス的にも1度で取得した方が良いのですね。
いろいろと勉強になりました。
ご回答ありがとうございましたっ!

お礼日時:2009/05/22 10:04

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

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

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

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

Q日本語の素晴らしさとは何か

 
英語と比べて日本語の素晴らしいところは何ですか。
また日本語の良くないところはありますか。

話し言葉としての日本語、書き言葉としての日本語、文法からみた日本語、文芸からみた日本語、コミュニケーション能力としての日本語、情報伝達手段としての日本語、その他あれこれとしての日本語についてお聞かせ下さい。
 

Aベストアンサー

 「日本語」といっても仮名文字もあれば漢字もあり、更にはローマ字もありますよね。だから一概に「ビジュアル系やオーディオ系」と簡単に分類もできない話ですよ。
 その漢字ですらも漢音もあれば呉音や唐音もあります。そしてこの漢字が日本に入ってきた当初の原則は「人の音に対して一文字を充てて表記する」とのルールの下で「文字記述」が行われてもいました。これを万葉仮名と呼び、文字の意味などはさほどに重視もしていなかった。その背景ですが、日本には「文字がなかった」ことが最大の理由です。
 その後、統治組織および法に基づく政治システムを確立するためにはどうしても「文書記録」が必要となり、文書様式を含めての「言語としての日本語」が本格的に形成され始めもします。
 そして中世から近世にかけて、質問者様が挙げられた「日本語的特性」に変化が現れ始めます。「南蛮文化」はそれまでとは全く異なる性質を有しその文化との邂逅がそれにあたります。
 ポルトガルの商人や宣教師達は「自身が耳で聴いた日本語」をそのままローマ字表記で記し、そこに母国語での訳語を載せた辞書を作ります。『日葡辞書』と呼ばれ、合理的な作りになっていることで知られてもいます。この文献を調べれば、その当時に「日本人がどの様に発音していたか」も知ることができます。
 他にも「同じ音でありながら、異なる文字を宛てる性質の仮名文字」もあります。たとえば「い→ゐ」「え→ゑ」です。そして「ゑ」も場合によって「酔う」や「要う」との漢字を充てられている場合もみられます。
 そして日本語と英語に共通する部分もあって「外来語の受容に寛容である」との部分です。英語のmoustacheの語源はフランス語に由来するとも言われ、日本語のカルタはポルトガル語のCartaに語源を発するとも言われています。
 そして「日本語を表記する」仮名文字も漢字は見かけで難しく見えますが筆順からみれば合理的かつバランス良く書く事ができるともいえるでしょうね。
 難点があるとすれば「方言」の問題で、話し言葉だけで理解しようとしても困難を窮める場合も多々あり、外国語を学ぶよりも苦労することも珍しくはありません。

 「日本語」といっても仮名文字もあれば漢字もあり、更にはローマ字もありますよね。だから一概に「ビジュアル系やオーディオ系」と簡単に分類もできない話ですよ。
 その漢字ですらも漢音もあれば呉音や唐音もあります。そしてこの漢字が日本に入ってきた当初の原則は「人の音に対して一文字を充てて表記する」とのルールの下で「文字記述」が行われてもいました。これを万葉仮名と呼び、文字の意味などはさほどに重視もしていなかった。その背景ですが、日本には「文字がなかった」ことが最大の理由です。
 ...続きを読む

QSIDとSERVICE_NAMEの違いとは?

tnsnames.oraの中の(CONNECT_DATA=に SIDだったりSERVICE_NAMEだったりしますが、どのような違いがあるのでしょうか?
どちらでもつながるのでいいかとは思いますが、何かメリット・デメリットでもあるのでしょうか?
それとも過去の遺物が未だ共存しているだけでしょうか?
SIDはインスタンスにつけられた名前だと知っていますが、SERVICE_NAMEってなんですか?

Aベストアンサー

SIDはインスタンスの識別子、service_nameはサービス名。
インスタンスとサービスの違いはRAC を勉強されるとよくわかると思います。

サービス名は初期化パラメータのservice_namesで設定します。
設定されていない場合は先述のとおりdb_unuque_name.db_domainになります。
(これが同義と誤解されやすい原因となっているわけですが)

ところで、service_namesパラメータですが、複数形になっていることからもわかるように、複数のサービス名をコンマ区切りで指定できるようになっています。

これをこのように使います。

2ノードRAC環境で、インスタンス1(SID=hoge1)、インスタンス2(SID=hoge2)があったとします。
ノードを意識することなく接続できるようにするためにクライアント側のtnsnames.oraにはこんな設定を追加します。

HOGE.EXAMPLE.COM
(DESCRIPTION =
(LOAD_BALANCE = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521))
(CONNECT_DATA = (SERVER = DECIDATED)(SERVICE_NAME = hoge.example.com))
)

インスタンス1とインスタンス2のservice_namesパラメータにhoge.example.comを追加します。すると、インスタンス1とインスタンス2にラウンドロビンで接続できるようになります。

ここで、もしtnsnames.oraのservice_name=...がSID=hoge1だったらどうなるでしょう?
インスタンス2のSIDはhoge2ですから一致せず、インスタンス2には接続できず、いつもインスタンス1に繋がってしまいます。

次に、一時的にメンテナンスのためにインスタンス2にアクセスしてほしくないケースを考えます。service_nameであれば、インスタンス2のservice_namesパラメータからhoge.example.comを削除することで(動的に変更できます)直ちにインスタンス1にのみ接続されるようにできます。

ここで、もしORACLE_SIDだったら・・・変更のためにインスタンスの再起動が必要になってしまいますね?

最後にservice_namesは複数登録できます。3ノードRAC環境において、オンライン処理(service_name=ONLINE)、バッチ処理(service_name=BATCH)があったとします。
バッチ処理は1つのノード(インスタンス1)でのみ処理したいとします。オンライン処理は3つのノードでしたいとします。

そんなとき、service_nameであれば、

<<サーバ側の初期化パラメータ>>
1:service_names = online, batch
2:service_names = online
3.service_names = online

<<クライアント側のtnsnames.ora>>

オンライン処理
ONLINE.EXAMPLE.COM
(DESCRIPTION =
(LOAD_BALANCE = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521))
(CONNECT_DATA = (SERVER = DECIDATED)(SERVICE_NAME = online.example.com))
)

BATCH.EXAMPLE.COM
(DESCRIPTION =
(LOAD_BALANCE = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521))
(CONNECT_DATA = (SERVER = DECIDATED)(SERVICE_NAME = batch.example.com))
)

と、クライアント側では接続先サーバを気にすることなく構成できますね?
BATCHのノードを1から2にしたい場合の変更はサーバ側のみでできますよね?
serivce_namesの"batch"設定をノード2に移すだけです。

SIDはインスタンスの識別子、service_nameはサービス名。
インスタンスとサービスの違いはRAC を勉強されるとよくわかると思います。

サービス名は初期化パラメータのservice_namesで設定します。
設定されていない場合は先述のとおりdb_unuque_name.db_domainになります。
(これが同義と誤解されやすい原因となっているわけですが)

ところで、service_namesパラメータですが、複数形になっていることからもわかるように、複数のサービス名をコンマ区切りで指定できるようになっています。

これをこのように...続きを読む

Q外国人に日本語を教えるときは日本語で教える?

まったく日本語を知らない外国人に日本語を教えるときは、日本語を使って教えるのでしょうか?
今まである程度日本語を知ってる人に日本語をボランティアで教えたことはあります。
そのときは、日本語を使って話しても相手は理解していたので、日本語で教えました。

今度まったく日本語を知らない外国人に、日本語を教えることになりました。
ボランティアなのですが、相手は日本に住んでいません。
どのように、教えたらいいでしょうか?
最初は、その人(ベトナム)の国の言葉で書かれた日本語テキストで初級文法をあらかじめ学んでもらうのがいいでしょうか?(そこを私に教えてほしいのだとは思うのですが・・・)。

*日本語をまったく知らない
*英語もそれほどできない

という外国人に、日本語を教える方法を教えてください。

よろしくお願いします。

Aベストアンサー

日本語を海外で教えた経験があります。
まったく日本語を知らない外国人の場合はその人がわかる言語で教えます。
ただ、システムが非常にうまくできている教材を使う場合は、日本語で教えることができます。たとえば椅子の絵が書いてあって横にIsuと書いてあればわかります。
また「私は走る」と書いて自分を指している絵があって、その横に走っている絵があります。
次に泳ぐ、勉強する、踊るとかそれぞれの動詞の横に絵が描いてあるような教材です。

でも・・・ 貴方の場合は相手が日本に住んでないのですからこれはかなり厳しいですね。

QSIDとSERVICE_NAMEの違い

tnsnames.oraの中の(CONNECT_DATA=に SIDだったりSERVICE_NAMEだったりしますが、どのような違いがあるのでしょうか?

Aベストアンサー

こんにちわ。

> どのような違いがあるのでしょうか?
どちらを使っても構わないはずです。
元々Oracle7/Oracle8 の時はSID のみだったはずです。
Oracle8i になって、グローバルデータベース名 (SERVICE_NAME)
が指定できるようになりました。

Q日本語教師って???

外国人に日本語や日本の文化を教える『日本語教師』。

知人が資格を取るべく勉強中ですが、彼女は英語やその他の外国語がまったく話せません。

不思議に思って「外国語は話せなくても大丈夫の?」と聞きましたが
「日本語で日本語を教える方法があるのよ」と煙に巻かれてしまいました(笑)
 
日本語がわからない相手に どうやって日本語で日本語を教えてるのか 合点がいきません。

ご存知の方、教えてください。

Aベストアンサー

知人に日本語教師がおります。
外国語は話せない・・・と言っております、実際授業を見てみると、英語まじりになってます。
「外国語を話せる」程度によるんだと思いますが、恐らく、大抵の日本語教師の方々は、カタコト英語なら大丈夫のハズです。

教わる相手(生徒)も、少なからず母国語以外を学ぼうとしている向上心のある方のはず(!)ですから、日本語または英語を少しくらい使えるのだと思います。

まったく母国語以外NGの生徒さんでも、例えば、電話機を手にとって「電話!」と言えば、手に持っているものは日本語で「でんわ」というんだな、と理解できますよね?
自分の事を指さして「わたし!」と言い、名札に書いてある名前を指さし「○○」と言うと、「あぁ、この人は○○さんなんだな」と理解できると思います(^-^;)

>「日本語で日本語を教える方法があるのよ」
ジェスチャーまじりの日本語で、日本語を教える事が出来るかも・・・

ちなみに、私の義兄はアメリカ人で、ほとんど日本語がNGです。義兄との会話は、私のカタコト英語と、ジェスチャーが主体です。
英語で英語を教わる事が出来るので、日本語で日本語を教える事も可能だと思います(^-^;)

知人に日本語教師がおります。
外国語は話せない・・・と言っております、実際授業を見てみると、英語まじりになってます。
「外国語を話せる」程度によるんだと思いますが、恐らく、大抵の日本語教師の方々は、カタコト英語なら大丈夫のハズです。

教わる相手(生徒)も、少なからず母国語以外を学ぼうとしている向上心のある方のはず(!)ですから、日本語または英語を少しくらい使えるのだと思います。

まったく母国語以外NGの生徒さんでも、例えば、電話機を手にとって「電話!」と言えば、手に持...続きを読む

QDBMS_STATS.GATHER_DATABASE_STATSの使い

DBMS_STATS.GATHER_DATABASE_STATSの使い方がわかりません。

PLSQLで下記のように入力して実行しましたが、1時間経っても結果が返ってきません。

 BEGIN
  DBMS_STATS.GATHER_DATABASE_STATS (
    OPTIONS => 'GATHER'
   ,CASCADE => TRUE
  ) ;
 END;

記述が間違っているのでしょうか?
DBMS_STATSの使い方がわかっていないのですが、プロシージャに埋め込まないとダメなものなのでしょうか?

Aベストアンサー

まず、回答としては、実行の仕方は合っています。
わざわざプロシージャを作る必要はありません。

質問者様の習熟度合いがわからないので一応書きますが、上記の無名PL/SQLブロックをSQL*Plus上にペーストした、と言う事でよろしいでしょうか?

この状態だとバッファに読み込まれただけで実行はされていないので、最後にスラッシュが無いと実行されません。

BEGEN

END;
/

そうではなくて、既に実行したのが結果が返って来ないと言う意味でしたら、GATHER_DATABASE_STATSで、GATHER CASCADE だと、相当時間が掛かるはずです。

普通は、cronかタスクスケジューラで仕掛けて夜間に走らせるような処理ですので

Q「Win7英語版+日本語パック」と「Win7日本語版」の違いは?

Win7製品版を購入する場合の質問です。
(1)Win7英語版を購入して日本語パックを適用して日本語環境を使用する。
(2)Win7日本語版を購入して日本語環境を使用する。

質問1.
上記(1)(2)での日本語使用上で何らかの違いがあるのでしょうか。
それともまったく同じものと考えていいのでしょうか。

質問2.
日本語使用上でまったく同じだとすれば、
「Win7英語版+日本語パック」は英語と日本語が切り替えて使用できるので「Win7英語版」を購入するほうがお買い得だといえるのでしょうか。

質問3.
「Win7日本語版」を購入して「英語パック」を追加すれば英語と日本語が切り替えて使用できるのでしょうか。
----------
以上です。よろしくお願いします。

Aベストアンサー

>日本語使用上で何らかの違い

英語版のものは、起動時は英語画面ですし、主な表示に一切日本語がありません。しかし、いったん設定をしたあとは、インターネットなどを見る、ワードなどを扱う際には、それほど苦労しないで使えます。

また、VISTAやXPで使うことのできる他の言語での起動した状態を再現するアプリケーションを利用することで、日本語で起動したように偽装する、場合によっては、原語情報を日本語としてネットのサイトなどのやり取りも可能ですし、日本語以外にインストールできないという制限のものも使うことができるようになります。

それを使うにはテクニックやそれなりの経験も必要かも知れないということです。

>「Win7英語版」を購入するほうがお買い得

英語をメインに使い、日本語も使いたい人にはお買い得でしょう。しかし、日本語メインの人には不便な面も多いので、慣れるのには苦労する、あるいは、使いこなせない可能性も結構あります。

>英語と日本語が切り替えて使用できるのでしょうか。

原語のオプションで日本語を選択追加するだけで英語版で日本語入力などが自由になるように、日本語版でも英語をオプションで追加するだけで英語入力が簡単にできます。

私は、日本語と英語版のVISTAやXPを半々程度使っていますが、どれも同時に英語も日本語も使えるようにしてあります。慣れているので、英語版でも困りませんが、起動時や設定はすべて英語ですので、それを切り替えることができないだけに、苦労することもあるかも知れません。

勉強にもなりますし、英語版はデザインも無駄が少ないように思えますので、私は好きなのですが、他人が私のパソコンを使おうとすると、思い通りに動かずに入力などで非常に苦労します。慣れですので、それを苦痛と感じなければ、お買い得でしょう。

>日本語使用上で何らかの違い

英語版のものは、起動時は英語画面ですし、主な表示に一切日本語がありません。しかし、いったん設定をしたあとは、インターネットなどを見る、ワードなどを扱う際には、それほど苦労しないで使えます。

また、VISTAやXPで使うことのできる他の言語での起動した状態を再現するアプリケーションを利用することで、日本語で起動したように偽装する、場合によっては、原語情報を日本語としてネットのサイトなどのやり取りも可能ですし、日本語以外にインストールできないという制...続きを読む

Qmod_plsql使用時のDBMS_OUTPUT.PUT_LINEの出力先

DBMS_OUTPUT.PUT_LINEを使用してデバッグメッセージを出力しようとしましたが、肝心の出力先がわからず困り果てています。

内部で使用しているApacheの設定ファイルへの記述ではないか、と当たりをつけてはみたものの、情報が少なく解決には至りませんでした。

現在Apacheのlogsディレクトリに出力されているファイルは、access.logとerror.log(とsslのログ)です。

見るべき情報ソース、パラメータの名前、設定値等ご存知の方はいらっしゃいませんでしょうか。

Aベストアンサー

ちょっとマニュアルを調べてみました。
良かったら参考にされてください。
間違ってたらすみません。

マニュアル Page78/176
「Oracle9i Application Server Oracle HTTP Server 管理ガイド リリース2 (9.0.2)」


以下の記述は、上記マニュアルの78ページを参考にしました。


mod_plsql の構成ファイル

$ORACLE_HOME/Apache/modplsql/conf/plsql.conf

『plsql.confの内容』※※※※※※※※※※※※※※※※

---- (省略) ----

# Syntax: PlsqlLogEnable [Off/On]
# Default: Off
PlsqlLogEnable Off <--- ここを「On」にすればログ出力

---- (省略) ----

# Syntax: PlsqlLogDirectory [directory]
# Default: [none]
PlsqlLogDirectory %ORACLE_HOME%/Apache/modplsql/logs
<--- ここで出力個所を指定

※※※※※※※※※※※※※※※※※※※※※※※※※

ちょっとマニュアルを調べてみました。
良かったら参考にされてください。
間違ってたらすみません。

マニュアル Page78/176
「Oracle9i Application Server Oracle HTTP Server 管理ガイド リリース2 (9.0.2)」


以下の記述は、上記マニュアルの78ページを参考にしました。


mod_plsql の構成ファイル

$ORACLE_HOME/Apache/modplsql/conf/plsql.conf

『plsql.confの内容』※※※※※※※※※※※※※※※※

---- (省略) ----

# Syntax: PlsqlLogEnable [Off/On]
# Default: Off
PlsqlLogEnable Off ...続きを読む

Q日本語と英語の中間にあたる言語といえば何語ですか?

翻訳ソフトで、日本語と英語を直接翻訳させると精度がまだ高くありません
そこで、日本語と英語の中間に当たる言語を間に挟むことで、
翻訳精度が高くなるのではないかと思い質問させていただきました

日本語と英語の中間に当たる言語といえば、何語になりますか?

・日本語→中国語→英語?
・日本語→フランス語→英語?
・日本語→スペイン語語→英語?

Aベストアンサー

途中に他の言語を挟んでも翻訳精度は上がらないと思います。
理由は、そもそもの日本語の文に英語化するために必要な情報が欠けている
そのようなケースが多いからです。
それよりも、翻訳しやすいように日本語に変える方が良いと思います。

・主語を明示する
・修飾関係があいまいにならないようにする。文を短くするとよい
・時制をはっきりさせる
・省略された文は、省略部分を補うようにする
・複数の意味がある言葉を避ける

などです。その方が効果があると思いすよ。

QOracleプロファイル設定(PASSWORD_GRACE_TIME)

Oracleのプロファイル設定で「PASSWORD_GRACE_TIME」パラメータでの質問です。本で調べたら、「パスワード失効後の最初のログインが成功してからのパスワードを変更するまでの猶予日数」とあります。
その「パスワード失効後」とは「FAILED_LOGIN_ATTEMPTS」で設定した回数でログイン失敗した後及び「PASSWORD_LIFE_TIME」を過ぎた後のことを言っているのでしょうか?
又、後者の場合、有効日数が過ぎて何日が経っても最初のログインを成功させることが出来てしまうのでしょうか?
よろしくお願い致します。

Aベストアンサー

PASSWORD_LIFE_TIMEで指定した期限をすぎても
ログインはでき、その後そのユーザがログインしたときからPASSWORD_GRACE_TIMEで指定した期限を過ぎると初めてユーザーのアカウントはロックされるようです。
--------前回パスワード変更
|
|
(PASSWORD_LIFE_TIME)
|
|
--------
|
|
--------PASSWORD_LIFE_TIME経過後初ログイン
|
(PASSWORD_GRACE_TIME)
|
--------パスワード変更しないとユーザアカウントロック

PASSWORD_LIFE_TIME経過後はログインごとに警告が出るようです。


「オラクルデータベースセキュリティガイド10g」の
「7セキュリティポリシー」の
 「パスワード・エイジングおよび期限切れ」にばっちり載っています。

以下URL参照してください。

参考URL:http://otndnld.oracle.co.jp/document/products/oracle10g/101/doc_v5/network.101/B13508-01.pdf

PASSWORD_LIFE_TIMEで指定した期限をすぎても
ログインはでき、その後そのユーザがログインしたときからPASSWORD_GRACE_TIMEで指定した期限を過ぎると初めてユーザーのアカウントはロックされるようです。
--------前回パスワード変更
|
|
(PASSWORD_LIFE_TIME)
|
|
--------
|
|
--------PASSWORD_LIFE_TIME経過後初ログイン
|
(PASSWORD_GRACE_TIME)
|
--------パスワード変更しないとユーザアカウントロック

PASSWORD_LIFE_TIME経過後はログインごとに警告が出るようです。


...続きを読む


人気Q&Aランキング

おすすめ情報