環境: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を多様している為、
何が間違っているか教えて頂ければと思います。
初歩的な質問で申し訳ありませんが、教えて下さい。
No.2ベストアンサー
- 回答日時:
ANo.1です。
説明の内容に誤解をまねく内容がありましたので訂正します。
>質問に書かれた【Aテーブル】の中身のように、
というのはちょっと違っていて、
start with 品目番号 = 'B'
となっているので、
【Aテーブル】
品目番号,親品目番号
B,A
B,C
の2レコードを拾ってきてそれぞれについて正展開しています。
だから、
start with 親品目番号 = 'B'
としたら、
B1,B
の1個しか拾ってこないから目的が達成できたと思うけど・・・
(未確認。ひょっとしたらエラーになるかもしれません。
申し訳ないですが今手持ちの試せる環境がないので。)
No.1
- 回答日時:
> 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
という順序で表示される方法はないでしょうか???
教えて頂ければ幸いです。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- Excel(エクセル) excelで検索した商品の画像(ネットワーク上の)を表示させたい。 3 2023/06/28 00:32
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- MySQL SQLで日付別のIDを生成するには 3 2022/10/09 10:34
- Visual Basic(VBA) EXCEL関数LOOKUPとFILTERについての質問です 1 2022/12/21 05:53
- その他(Microsoft Office) 同じ番号に並び替え 1 2022/10/21 22:37
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Excel(エクセル) エクセルの表について 3 2023/04/14 18:00
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
Order by句でバインド変数を使...
-
SQL 特定のカラムが最大値のレ...
-
沿線コード
-
CREATE テーブルでの複数外部...
-
Excelファイルのデータをテーブ...
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
SELECTで1件のみ取得するには?
-
select句副問い合わせ 値の個...
-
ファイル書込みで一行もしくは...
-
GROUP BYを使ったSELECT文の総...
-
OracleのSQL*PLUSで、デー...
-
他のテーブルを参照した値はupd...
-
Accessで別テーブルの値をフォ...
-
SQL文で右から1文字だけ削除す...
-
ADO VBA 実行時エラー3021
-
Excelでセルの書式設定を使用し...
-
キーが同じを複数行を1行にま...
-
カレントレコードが無い事を判...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
CREATE テーブルでの複数外部...
-
Order by句でバインド変数を使...
-
沿線コード
-
SQLServer 日付が直前のレコー...
-
Excelファイルのデータをテーブ...
-
10営業日前の日付を取得したい...
-
SQLの実行結果が異なる
-
SQLに関して
-
【SQL】またぎデータの検索の仕方
-
SQLにて縦を横へ展開
-
ヤマト急便のチェックデジット...
-
スペシャリストの方! 助けてく...
-
SQL GROUP BY
-
娘の学校から出た暗号解読です...
-
SQLで<>を使用するとき、
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
-
Oracleでの文字列連結サイズの上限
-
SELECTで1件のみ取得するには?
おすすめ情報