アプリ版:「スタンプのみでお礼する」機能のリリースについて

環境: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を多様している為、
何が間違っているか教えて頂ければと思います。


初歩的な質問で申し訳ありませんが、教えて下さい。

A 回答 (2件)

ANo.1です。



説明の内容に誤解をまねく内容がありましたので訂正します。
>質問に書かれた【Aテーブル】の中身のように、
というのはちょっと違っていて、

start with 品目番号 = 'B'
となっているので、

【Aテーブル】
品目番号,親品目番号
B,A
B,C
の2レコードを拾ってきてそれぞれについて正展開しています。

だから、
start with 親品目番号 = 'B'
としたら、
B1,B
の1個しか拾ってこないから目的が達成できたと思うけど・・・
(未確認。ひょっとしたらエラーになるかもしれません。
 申し訳ないですが今手持ちの試せる環境がないので。)
    • good
    • 0
この回答へのお礼

Siegrune様、ありがとうございます。

なんとか目的を達成する事ができました。

ありがとうございました!

お礼日時:2012/08/03 15:09

> select 品目番号 as 下位品目番号,親品目番号 from A_TABLE


> where 品目番号 != 'B' AND 親品目番号 = 'B'
> start with 品目番号 = 'B' connect by prior 品目番号 = 親品目番号
で、質問のデータなら、

>2回表示されてしまいます。
というのは当然の結果と思います。

実際の【Aテーブル】の中身が
品目番号,親品目番号
A
A1,A
B,A
B1,B
C
D,C
B,C
 ※ Bが共通の構成です。
ともっており、B1,Bが1個しかないのになぜ?
と思われるかもしれませんが、
------------引用-------------
Oracleは次のように階層問合せを処理します。
最初に、結合(指定されている場合)が、FROM句で指定されているか、またはWHERE句述語で指定されているかが評価されます。
CONNECT BY条件が評価されます。
残りのWHERE句述語が評価されます
------------引用おわり-------------
http://docs.oracle.com/cd/E16338_01/server.112/b …
より。
とあるように
> where 品目番号 != 'B' AND 親品目番号 = 'B'
より先に
> start with 品目番号 = 'B' connect by prior 品目番号 = 親品目番号
が行われるので、
質問に書かれた【Aテーブル】の中身のように、
B1,Bが2個ある状態で、
> where 品目番号 != 'B' AND 親品目番号 = 'B'
が適用され、2個でてきます。

この回答への補足

Siegrune様、ご回答ありがとうございます。

詳細に教えて頂き、本当にありがとうございます。

同様の内容を別HPにも問い合わせしている事をお許し下さい。

ご指摘頂いたように、私のSQLでは2件表示されるのは当然なようですね、、、

なんとかこれをB以下を1回だけ表示させられないかとdistinctを使い表示させましたが、
それでは並び順がぐちゃぐちゃになってしまいます。

B1の下にもB2あるいはB3というデータあった場合でも、正しく

B
B1
B2

という順序で表示される方法はないでしょうか???

教えて頂ければ幸いです。

よろしくお願いします。

補足日時:2012/07/30 16:30
    • good
    • 0

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