- - PR -
共通表式の利用方法について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-08-26 17:41
はじめまして、公太郎と申します。
基本的なSQLの問題で恐縮なのですが、いろいろ調べたのですが今ひとつわかりません。 よろしくお願い対します。 一つのテーブル内にて、 データがツリー構造になってしまっているテーブルがあります。 ID|親ID|名称 ------------------ 01| 00|部品0-1 02| 00|部品0-2 11| 01|部品1-1 12| 01|部品1-2 21| 11|部品2-1 これを共通表式を利用すると、IDに属する部品が取得できることを知りました。 親IDが01のものの、子、孫、ヒマゴ・・・と階層的にたどって、系列のデータを取得できますよね。 私の試したSQLだと、以下のような形になります。 ==================================== WITH RPL (PARENT_ID, ID) AS (SELECT ROOT.PARENT_ID,ROOT.ID FROM ROOT WHERE ROOT.PARENT_ID = '01' UNION ALL SELECT CHILD.PARENT_ID,CHILD.ID FROM RPL PARENT,CHILD WHERE PARENT.ID = CHILD.PARENT_ID ) SELECT DISTINCT RPL.ID from RPL; ==================================== ここで、お尋ねしたいのですが、 共通表式を利用した場合に行うことができるのは、 単純な上記のような参照までなのでしょうか? たとえば、この結果をWHERE句の条件に指定したり、 共通表式同士をUNIONしたりといった操作はできますか? いろいろと試してみましたが、エラーになってしまいます。 テーブル構造の指摘は別にして、 単純にSQLの書式、共通表式で可能な範囲について、ご教授いただければと思います。 以上、よろしくお願い致します。 | ||||||||||||
|
投稿日時: 2005-08-26 17:50
以前@ITでSQL99の再帰SQLの例
http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_1b.html でWhere句に指定していたりするので出来るとは思いますが・・・。 実際に公太郎さんが実行した環境のDBMSやバージョンが書かれていませんし、 エラーとなったSQLも分からないので、 なんともいえません・・・。 | ||||||||||||
|
投稿日時: 2005-08-26 18:10
ご回答ありがとうございます。
DBはベンダを問わず、どこまで可能なのかが知りたかったため、 敢えて記入しませんでした。申し訳ありませんでした。 ちなみに、以下のことまではできることを確認しております。 ==================================== WITH RPL (PARENT_ID, ID) AS (SELECT ・・・・・・ UNION ALL SELECT ・・・・・・) SELECT ・・・ WHERE IN (SELECT DISTINCT RPL.ID from RPL); ==================================== ただ、このSELECTをUPDATEに置き換えると、構文エラーがでてしまいます。 何が原因なのかわかりません。 言葉足らずで申し訳ありませんが、よろしくお願いします。 | ||||||||||||
|
投稿日時: 2005-08-26 18:17
それはSQL99(92?)の規格に何処まで準じているかと +αの機能を実装しているのか? などに依存するので、ベンダごとに調べたほうが良いかと思います。 #ベンダごとでSQLの書き方も異なったりしますし・・・。 本題ですが、最初の投稿で
とかかれたのでWhere句で条件指定したい、UNIONしたい って要望かと思ったのですが、 2つ目の投稿で
と書かれています。 公太郎さんが目的とすることが複数考えられるので 項目としてもう一度あげてもらっても良いですか? #箇条書きなどにしていただけると嬉しいです。 |
1