階層構造に対するSQLに関して教えてください

このQ&Aのポイント
  • 階層構造に対するSQLに関して教えてください。組織の階層構造において、下位層の品番を指定し、その人が所属している部署のトップを抽出するためには、どのようなSQLを記述すれば良いのでしょうか?
  • 階層構造の組織データにおいて、トップを指定し、それ以下の組織を表示させるのは簡単ですが、下位層の品番を指定し、その人が所属している部署のトップだけを抽出するためには、どのようなSQLを記述すれば良いのでしょうか?
  • 階層構造に対するSQLに関して教えてください。組織の階層構造における下位層の品番を指定し、その人が所属している部署のトップを抽出するためには、どのようなSQLを使えば良いのでしょうか?
回答を見る
  • ベストアンサー

階層構造に対するSQLに関して

階層構造に対するSQLに関して教えて下さい。 以下のような階層構造になっているデータが存在していますが、単純にトップを指定し、それ以下の 組織を表示させる事は簡単かと思われますが、下位層の品番を指定、その人が所属している部署のトップだけを 抽出するようなSQLはどのように記述すれば良いでしょうか、、、 恐らくCONNECT BY を使うかと思われますが、記述の仕方がわかりません。 以下のケースでは、TANAKAさんを指定した場合、TANAKAさんは兼務している為、トップとしては、 SUZUKIさんとSASAKIさんが抽出されるSQLとしたいです。 【テーブル内容】 EMPNO ENAME MGR(上司) 1 SUZUKI 2 SATO 1 3 YAMADA 1 4 TANAKA 3 5 FUKUDA 1 6 ENDO 5 7 KOIKE 6 8 SASAKI 4 TANAKA 8 よろしくお願いします。

  • Oracle
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • dda167
  • ベストアンサー率76% (55/72)
回答No.1

connect_by_root演算子が使えるのでは? (例) select connect_by_root ename as rootname from emp where ename = 'SCOTT' start with mgr is null connect by prior empno = mgr ; 詳しくはgoogle先生に聞いてください。

その他の回答 (1)

  • dda167
  • ベストアンサー率76% (55/72)
回答No.1

connect_by_root演算子が使えるのでは? (例) select connect_by_root ename as rootname from emp where ename = 'SCOTT' start with mgr is null connect by prior empno = mgr ; 詳しくはgoogle先生に聞いてください。

関連するQ&A

  • select文の記述について

    select文の記述について質問させていただきます。 下記のデータベースのテーブルの先頭からnumberを条件として 2名分のデータをselect文にて抽出したいと思っております。 (numberが重複し、重複数も異なるデータとなります。) select文の記述をどのようにするか教えていただければと思っております。 よろしくお願いいたします。 データベースのテーブル +——+—————+—————+————+ | id | name | number | score | +——+—————+—————+————+ | 1 | tanaka | 358 | 98 | | 3 | tanaka | 358 | 23 | | 4 | tanaka | 358 | 45 | | 11 | yamada | 126 | 63 | | 17 | yamada | 126 | 77 | | 23 | suzuki | 274 | 36 | | 45 | suzuki | 274 | 16 | | 59 | suzuki | 274 | 89 | | 73 | suzuki | 274 | 75 | | 80 | hanako | 89 | 24 | | (以下続く) | +——+—————+—————+————+ 抽出結果 +——+—————+—————+————+ | id | name | number | score | +——+—————+—————+————+ | 1 | tanaka | 358 | 98 | | 3 | tanaka | 358 | 23 | | 4 | tanaka | 358 | 45 | | 11 | yamada | 126 | 63 | | 17 | yamada | 126 | 77 | +——+—————+—————+————+

    • ベストアンサー
    • MySQL
  • 【SQL】SELECT 文で外部のレコードと比較する。

    こんにちわ タイトルがわかりにくく申し訳ありません。^^;) 【やりたい事】 ○テーブルA に下記のレコードが有ります。 ID FIRSTNAME  LASTNAME 00 ICHIRO     SUZUKI 01 TARO      YAMADA 02 TSUYOSHI   SHINJYO ○テーブルB に下記レコードが有ります。 ID LASTNAME 00 SUZUKI 01 SASAKI ここで テーブルB に登録されている LASTNAME と同じ LASTNAME を持つレコードを テーブルA から抽出する SQL を教えて頂けないでしょうか? この状態で抽出されるレコードは 00 ICHIRO SUZUKI です。 お時間のある時で構いませんので、よろしくお願い致します。

  • エクセルVBAでのSQLについて

    エクセルVBAで、SQLを記述しているのですがwhereの抽出条件にセルの値を指定したいと思っています。その当該セルの値を変更することで、抽出条件を変更することができるようにしたいです。 しかし、どのような記述にすればよいか分かりません。以下のような記述をしたのですが、うまくいきません。すみませんが、教えていただけないでしょうか。よろしくお願い申し上げます。 ◆抽出条件を指定するセル:A1 セルA1には、数字(例:1000、2000等)をいれます。 mySQL = " SELECT * FROM [◆◆シート!] WHERE Range("A1")"

  • ディレクトリの階層構造をツリー表示したい

    指定したディレクトリ以下のディレクトリの階層構造を、ツリー表示するプログラムを作りたいと思っています。 階層構造は、階層が下がるごとにインデントをつけてツリー表示したいと思っています。 指定ディレクトリ以下のディレクトリ名をすべて表示させるところまではできたのですが、インデントをうまくつけられずに困っています。 ソースは以下のようにしました。 ---------------------------------- import java.io.File; public class DirTree { String dirName; void showDirName(){ File directory = new File(dirName); File[] subFiles = directory.listFiles(); for (int i = 0; i < subFiles.length; i++) { if(subFiles[i].isDirectory()==true) { System.out.println(subFiles[ i ].getName() ); dirName = subFiles[ i ].getPath(); showDirName(); } } } } --------------------------------------------- 何かよい方法や、ここをこうしたらと言うのがありましたら教えていただけませんでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • SQL テーブル結合

    こんばんは SQLのselectで困っています。 以下の2つのテーブルから、 ID=2の人のID,名前,Birthday,2007年の合計給与を取得したい時、 どのようなSQLにすればよいのでしょうか>_< Empテーブル --------------------------------------- ID | Name |Birthday -----|---------|----------------------- 1  |Suzuki  |19491120 2  |Tanaka  |19551020 3  |Ito   |19500203 -----|---------|----------------------- 給与テーブル(上期下期で分かれている) --------------------------------------- ID |Year |Term |Salary -----|-------|------------|------------ 1 |2007 |FirstHalf |2200000 1 |2007 |SecondHalf |1950000 1 |2008 |FirstHalf |2000000 1 |2008 |SecondHalf |1900000 2 |2007 |FirstHalf |2000000 2 |2007 |SecondHalf |2000000 2 |2008 |FirstHalf |2100000 2 |2008 |SecondHalf |1800000 -----|-------|------------|---------- 色々試したのですが、いまいちわかりません。 アドバイスお願いします!

  • SQL*PLUSに関して

    標記の件に関しまして 私はデータベースに関する知識は全く無いのですが SEが私のクライアントに設定した SQL*PLUSを使用してた売上データベースからのデータの抽出 機能がありまして これとは違う条件でのデータ抽出が必要となり 何とかSQL文を部分的に加工して目的が達成できるかどうか 調べているところであります。 ■疑問点■ SQL*PLUSのコマンドファイルは既に作成されていて @~でメモ帳ファイルに記述されているSQL文を 指定すればSPOOLでデータが別のテキストファイルに 抽出されるようになっているようです。 この場合に 既存のSQL文が記述されているメモ帳ファイルの抽出条件を 加工してコマンドにて加工後のファイルを@~で実行すれば 必要としているデータを抽出することができるでしょうか? あと 現在使用しているSQLで下記の部分が共通して記述されて いるのですがこれはどういった意味でしょうか。 SET ECHO OFF SET HEADING OFF SET PAGESIZE 0 SET FEEDBACK OFF SET LINESIZE 30000 SET TRIMSPOOL ON SPOOL C:ファイルの場所 ■ここに抽出条件があるようです。■ SPOOL OFF EXIT 0; 大変申し訳ございませんが 現在はSEから購入したシステムから紙ベースで 出力して手作業で入力を行っているため 何とかデータベースから直接抽出できないか 模索しているところであります。 アドバイス頂けますでしょうか。 宜しくお願いします。

  • 売り上げ集計SQLが作れません

    1つのTABLEに、1日の売上げ高を商品ごとに登録していくDBがあります。 簡単な構造は以下のとおりです。 日付       |A品売上額  |B品売上額 | 2008/11/01 |500000    |600000   | 2008/11/02 |450000    |800000   | 2008/11/03 |100000    |700000   | ・・・ 2008/11/30 |200000    |500000   | 2008/12/01 |300000    |100000   | <質問> それぞれの商品の1ヶ月売上高をSQLで抽出したいと思うのですが、Group byで何を指定したらいけるのかわからず困っています。 SQLで計算せずに抽出だけ行って、CGI側で計算するしかないのでしょうか? アドバイスお願いいたします。 <最初に考えたSQL(Group byがないためエラーになりました)> select sum(a),sum(b) from uriage where date between '2008/11/01' AND '2008/11/30';

  • SQLのクエリで教えてほしいです。

    SQLのクエリで教えてほしいです。 ある列のTOP10を出してグラフを作成したいと考えております。 また、そのTOP10の行をカウントして何件あるかを知りたいのですが なかなか思うように動きません。 以下クエリを作ったのですが、結果に16行の結果(Top16?) になってしまいます。 また、一つのSQLで、Countも含めたいと思ってますが、こういった場合 はどこに記述すればいいのでしょうか。 select TOP (10) Percent hoge from hogehoge group by hoge order by hoge ご存知の方、よろしくお願い致します。

  • SQL文の書き方について

    お世話になります。下記のような結果を求めるSQL文についてどなたかご教示をお願いします。 以下の2つのテーブル(SMPL_TBL1,SMPL_TBL2)があったとします。 (SMPL_TBL1) ID | NAME | BUSHO ---+--------+--------- 01 | YAMADA | A_GRP 02 | SUZUKI | A_GRP 03 | OKADA | B_GRP 04 | TAKAGI | C_GRP (SMPL_TBL2) ID | POINT | ---+-------+- 01 | 1 | 01 | 2 | 01 | 3 | 02 | 1 | 02 | 2 | 03 | 1 | 04 | 1 | 04 | 2 | 04 | 3 | 04 | 4 | 04 | 5 | 上記テーブルから以下のような結果を得たい場合、 どのようなSQL文を投げればいいでしょうか? (求める結果) ・各人ごとのPOINTのMAX値と各人のデータを抽出(POINTは1~999までの整数です) ID | NAME | POINT| BUSHO ---+--------+------+-------- 01 | YAMADA | 3 | A_GRP 02 | SUZUKI | 2 | A_GRP 03 | OKADA | 1 | B_GRP 04 | TAKAGI | 5 | C_GRP よろしくお願いいたします。

  • 階層問い合わせ?親子展開したVIEWを作りたい

    親子のデータを展開したVIEWを作成したいのですが、調べてみると 階層問い合わせというものがあるということまで分かりました。 (階層問い合わせ自体よく分かっていません) その内容でSQLを以下のように記述してみたのですが、どうも思惑と 若干違います。思惑は親コードは最上位のものを出して、そこに子供で ぶらさがっているKOCDを全部羅列したいのです。 どのようなSQLにすれば可能でしょうか。ご教授のほど、お願い致します。 記述したSQL SELECT OYACD,KOCD FROM TBL1 START WITH OYACD = 0 CONNECT BY PRIOR KOCD = OYACD TBL1の内容 OYACD KOCD -------------- 10001 10002 10001 10003 10001 20001 20001 20002 20001 20003 0 10001 親=0が最上位の親 SQLの結果 OYACD KOCD -------------- 0 10001   10001 10002 10001 10003 10001 20001 20001 20002  ここと 20001 20003  ここのOYACD 現在はひとつ上の親が出ている このSQLの結果のOYACDで20001が最上位のOYACDの10001として 見えるようなSQLにしたいのですが、どうすれば可能でしょうか。 このように見えて欲しい OYACD KOCD -------------- 0 10001   10001 10002 10001 10003 10001 20001 10001 20002  ここと 10001 20003  ここを最上位の親を表示したい。