- PR -

共通表式の利用方法について

1
投稿者投稿内容
公太郎
会議室デビュー日: 2003/09/19
投稿数: 15
投稿日時: 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の書式、共通表式で可能な範囲について、ご教授いただければと思います。

以上、よろしくお願い致します。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-08-26 17:50
以前@ITでSQL99の再帰SQLの例
http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_1b.html
でWhere句に指定していたりするので出来るとは思いますが・・・。

実際に公太郎さんが実行した環境のDBMSやバージョンが書かれていませんし、
エラーとなったSQLも分からないので、
なんともいえません・・・。
公太郎
会議室デビュー日: 2003/09/19
投稿数: 15
投稿日時: 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に置き換えると、構文エラーがでてしまいます。
何が原因なのかわかりません。

言葉足らずで申し訳ありませんが、よろしくお願いします。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-08-26 18:17
引用:

公太郎さんの書き込み (2005-08-26 18:10) より:

DBはベンダを問わず、どこまで可能なのかが知りたかったため、
敢えて記入しませんでした。申し訳ありませんでした。


それはSQL99(92?)の規格に何処まで準じているかと
+αの機能を実装しているのか?
などに依存するので、ベンダごとに調べたほうが良いかと思います。
#ベンダごとでSQLの書き方も異なったりしますし・・・。

本題ですが、最初の投稿で
引用:

ここで、お尋ねしたいのですが、
共通表式を利用した場合に行うことができるのは、
単純な上記のような参照までなのでしょうか?
たとえば、この結果をWHERE句の条件に指定したり、
共通表式同士をUNIONしたりといった操作はできますか?
いろいろと試してみましたが、エラーになってしまいます。


とかかれたのでWhere句で条件指定したい、UNIONしたい
って要望かと思ったのですが、

2つ目の投稿で
引用:

ただ、このSELECTをUPDATEに置き換えると、構文エラーがでてしまいます。
何が原因なのかわかりません。


と書かれています。


公太郎さんが目的とすることが複数考えられるので
項目としてもう一度あげてもらっても良いですか?
#箇条書きなどにしていただけると嬉しいです。
1

スキルアップ/キャリアアップ(JOB@IT)