OracleのSQLでツリー表示取得

このQ&Aのポイント
  • OracleのSQLを使用してツリー表示を取得する方法について質問です。
  • プロジェクトから離れた方が書いたSQLを修正したものを使用していますが、値が取れない問題が発生しています。
  • テーブルには4つのレコードが格納されており、keyIDは全レコードで同じ値です。どこが間違っているか教えてください。
回答を見る
  • ベストアンサー

OracleのSQLでツリー表示取得

いつもお世話になります。 SQLの質問なのですが、現在プロジェクトから離れていった方が書かれたSQLが違っていたので、いろいろと修正してみたのですがうまく値が取れないのでどこが間違っているかご相談したく 記述したSQL: SELECT * FROM XXXTBL WHERE keyID = 'aaa' START WITH PARENT_ID=0 CONNECT BY PRIOR PARENT_ID=ID ORDER BY ID; とりたい値:   id  項目名  PARENT_ID   0    親   null 2 A    0 3 B 0 4 B-1 3 とってきた値   id  項目名  PARENT_ID   0    親   null   0    親   null 2 A    0 3 B 0 となります。 いろいろと調べてみたのですが、何が違うのか判らず・・・・・ 現在は調査というレベルなので、テーブルには上記の4レコードのみが入っています。 keyIDは全レコードに同一のものが入っています。 もしかしたら、すごく基本なことなのかもしれませんが よろしくご教授お願いいたします。

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

  • ベストアンサー
回答No.1

まずCONNECTは CONNECT BY PRIOR 親行の項目 = 子行の項目 です。 なので、記述されたSQLでは、 START WITH PARENT_ID=0により、まず(2,'A',0)、(3,'B',0)が選択され、次に親行である(2,'A',0)のPARENT_ID(0)から子行としてID=0の(0,'親',NULL)が選択され、その次に親行である(3,'B',0)のPARENT_ID(0)から子行としてID=0の(0,'親',NULL)が選択され、以上の結果がORDER BYされて「とってきた値」という結果になります。 「とりたい値」から思うに START WITH ID = 0 CONNECT BY PRIOR ID = PARENT_ID でしょう。(もしくは START WITH PARENT_ID IS NULL) たぶん(^^;

utatane
質問者

お礼

レスありがとうございます。 質問を書いた後にもいろいろ試してみてFlossenEngelさんのおっしゃるとおりの形となりました^; 自己解決でレスが書きたくても書けない仕様なので、すぐにお礼が言えず申し訳ありませんでした。

関連するQ&A

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • MySQLのSQLについて

    テーブル名:table ------------------------------------ 初回アクセス,日付,名前,顧客ID,URL Y,2017/01/01,Aさん,001,http://aaa.jp NULL,2017/01/01,Aさん,001,http://aaa.jp/test.php NULL,2017/01/01,Aさん,001,http://aaa.jp/blog/ Y,2017/01/02,Bさん,002,http://aaa.jp NULL,2017/01/02,Bさん,002,http://aaa.jp/test.php NULL,2017/01/02,Bさん,002,http://aaa.jp NULL,2017/01/02,Bさん,002,http://aaa.jp/blog/ Y,2017/01/03,Cさん,003,http://aaa.jp/test.php NULL,2017/01/03,Cさん,003,http://aaa.jp ------------------------------------ 上記の様なテーブルを作りアクセスデータを蓄積しています。 これらを1ページ目のランキング、2ページ目のランキング、3ページ目のランキングとつくりたいです。 例えば、 ------------------------------------ SQL ------------------------------------ SELECT `table`.`URL`, COUNT( `table`.`URL`) AS `count` FROM `table` WHERE `table`.`初回アクセス` = 'Y' GROUP BY `table`.`URL`; ------------------------------------ 結果 ------------------------------------ URL,count http://aaa.jp,2 http://aaa.jp/test.php,1 1ページ目のランキングは上記SQLで作れるのですが、2ページ目以降のランキングの作り方が分かりません。 何か良い方法等ありませんか?

    • ベストアンサー
    • MySQL
  • 一つのSQL文で取得したい

    こんにちは。 テーブルAに以下のようなデータがあるとします。 ID |名称 |項目 -------------- 01 |ああ | 02 |いい | 03 |うう |01,02 04 |ええ |01 SELECT文で取得したいのは、フィールド「項目」の値を、他のレコードの名称で置き換えた列です。 つまり、 ID |名称 |項目 |項目名称 ------------------ 01 |ああ | | 02 |いい | | 03 |うう |01,02 |ああ,いい 03 |ええ |01 |ああ という結果が欲しいということです。 「項目」の値はカンマで区切られています。 これを一つのSQLで取得したいと思っています(テーブルの結合、サブクエリーはOK)が、方法がわかりません。 どなたかどうぞご教授ください。 よろしくお願い致します。

  • SQLについて

    A B -------------------------------------------- 1111111             22222222222 -------------------------------------------- nullまたはブランク       33333333333 -------------------------------------------- 12121212           nullまたはブランク -------------------------------------------- 上記のようなレコードがあります。(A,Bはカラム名) 並べ替えを行いたいのですが、条件があります。 カラム名Aをキーにして並べ替えを行いたいのですが、 もしカラム名Aにデータがない場合は、変わりにBのデータを使用して並べ替えを行いたい、というものです。上記の場合、この条件で並べ替えるときは、1レコード目のAの値と、2レコード目のBの値、3レコード目のAの値でソートしたいということになります。このような並べ替えの方法をご存知の方がいらっしゃいましたら、ご教授ください。大変困っています。 DB:ORACLE8

  • sqlのJoinでこんなこと出来ますか、

    sqlのJoinでこんなこと出来ますか、 当方初心者につき宜しく御願いします。 テーブルAにはIDがありIDはユニークです。テーブルBにはIDと項目がありIDは複数件存在します。項目には「あ」又は「い」、「う」、「え」、「を」が入っています。idに対して「あ」だけの時もあれば、「い」、と「う」が存在する時もあります。1件または複数件存在します。 条件に「あ」を抽出するようにして、「あ」がないときは存在するがテーブルBには存在するという結果を作りたいのです。 ID=1、あ ID=2、NULL という結果を作りたいのです。テーブルの双方に存在して、かつ「あ」であれば「あ」以外はNULLのレコードを作りたいのです。 説明が悪くて申し訳ありませんが宜しく御願い致します。

    • ベストアンサー
    • MySQL
  • 以下の場合のSQL文の書き方教えてください。

    2つのテーブルÅ、Bに同じ項目名(NYUSYA_DATE)が存在していて、 通常はAからデータを取得し、取得した値がNULLの場合は、Bから取得します。 これを1つのSQLで出来ますか? 今は、両方取得しておいて、IF文で判定しようとしています。 テーブルA SYAIN_ID (NOT NULL) NYUSYA_DATE テーブルB GROUP_ID (NOT NULL) SYAIN_ID NYUSYA_DATE

  • SQLに関して

    環境:Oracle 11g SQLで階層問い合わせに関して教えて下さい。 今、ある部品テーブルに対し、直下のレコードのみを抽出しようとしていますが、ある共通の 構成をA部品群、B部品群の中に入れた場合、なぜか同じ結果が2回表示されてしまいます。 以下にサンプルのデータとSQLを作成しましたので、何がおかしいか教えて頂きたいと思います。 【Aテーブル】 品目番号,親品目番号 A A1,A B,A B1,B ↑ A部品群 C D,C B,C B1,B ↑ B部品群  ※ Bが共通の構成です。 【SQL】 select 品目番号 as 下位品目番号,親品目番号 from A_TABLE where 品目番号 != 'B' AND 親品目番号 = 'B' start with 品目番号 = 'B' connect by prior 品目番号 = 親品目番号 【結果】 下位品目番号,親品目番号 B1,B B1,B 2回表示されてしまいます。 単純に親品目番号=’B’としてしまえば正しく拾えますが、上記のSQLを多様している為、 何が間違っているか教えて頂ければと思います。 初歩的な質問で申し訳ありませんが、教えて下さい。

  • SQL

    テーブル情報 id start_dt end_dt --+----------+---------- 1 2014-01-07 2014-01-20 2 2014-01-08 Null 3 2014-01-09 Null 4 2014-01-10 Null 5 2014-01-11 Null を以下のSQL文の場合 select * from infomation where start_dt <= '2014/01/10' and (end_dt >= '2014/01/10' or end_dt is null) order by start_dt desc limit 3 id start_dt end_dt --+----------+---------- 4 2014-01-10 Null 3 2014-01-09 Null 2 2014-01-08 Null が取得されます。 id start_dt end_dt --+----------+---------- 4 2014-01-10 Null 3 2014-01-09 Null 1 2014-01-07 2014-01-20 の結果のように取得するSQL文をつくることは可能でしょうか? 何がしたいかというと ・start_dtが新しい順に並べる。 ・3件のレコードを取得する。 ・start_dtが'2014/01/10'より古いレコードを取得する。 ・end_dtが'2014/01/10'より新しいレコードがある場合は、Nullのレコードより優先する。 どうかお助けください。

    • ベストアンサー
    • MySQL
  • SQLでデータを1件だけ取得したいのですが。

    SQLでデータを1件だけ取得したいのですが。 以下のようなテーブルが2つあるとします。 ------------------------------------ テーブルA     テーブルB   値X           値X    値Y   1           1    20   2           2    NULL   3           2    60   4           2    70               4    NULL               4    NULL ------------------------------------ ここで、テーブルAの値Xと、テーブルBの値Xをリンクさせます。 テーブルAにデータがあれば、テーブルBに無くても出力します(外部結合イメージ) テーブルAの値Xに対して、テーブルBの値Xは2件以上リンクされる可能性があります。 この場合は1件のみ出力します。 その1件の決め方は、テーブルBの値YがNULLでは無く最大の物です。 但し値Yは全てNULLの可能性もあるので、その場合NULLとして1件出力します。 上記の出力イメージ ------------------------------------  値X    値Y  1    20  (1件の場合そのまま出力。1件がNULLでもそのまま出力)  2    70  (NULLではない最大の1件を出力)  3    NULL  (テーブルBになくても出力)  4    NULL  (値が全てNULLの場合、NULLとして1件出力) ------------------------------------ どのようなSQLを記載すれば実現可能でしょうか?

  • ある条件でのSQLの取得方法について

    以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー   項目1 10     X 20     Y ・テーブルB キー  項目2  項目3 10     5    C 10     6    D 12     6    E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は  別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、  複数件あるかも知れません。  無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと  同じレコードに、項目2が同じデータの情報を出力します。  項目2が同じデータが無い場合はこの情報は出力しません。  項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値 10  テーブルA   X 10  テーブルB         5    C 10  テーブルB         6    D        12            E 20  テーブルA   Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?