質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

332閲覧

SQL 結合後に、union all

hk3150

総合スコア11

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/04/22 07:58

前提・実現したいこと

SQLでunion allを使用し、
縦軸に複数の製品品番データをまとめたいのですが、
複数品番の最初の品番のみ表示されてしまいます。

該当のソースコード

SQL

1 2SELECT DISTINCT 構成マスタ.M_NUM AS 製品品番, 3 '' AS1, 4 構成マスタ.P_NUM AS 部品品番, 5 部品名.P_NAME AS 品名, 6 構成マスタ.T AS 手配, 7 構成マスタ.H_CODE AS 保管, 8 部品アドレス.H_ADD AS アドレスN, 9 構成マスタ.U_NUM AS 原単位数, 10 '' AS 出庫指示数, 11 '' AS 出庫実績, 12 '' AS 備考, 13 '' AS 担当名, 14 A.QTY AS 帳簿在庫, 15 B.QTY AS 貸出在庫 16           17 18from 構成マスタ 19 20inner join 部品名 ON 21構成マスタ.C_NUM = 部品名.C_NUM 22inner join 部品名 ON 23構成マスタ.C_NUM = 部品名.P_NUM 24AND 構成マスタ.H_CODE = 部品アドレス.H_CODE 25left outer join (select* from 在庫 where ac_code ='1') A ON 26構成マスタ.C__NUM = A.P_NUM 27AND 構成マスタ.WH_CODE = A.WH_CODE 28left outer join (select* from 在庫 where ac_code ='6') B ON 29構成マスタ.C_NUM = B.P_NUM 30AND 構成マスタ.H_CODE = B.H_CODE 31 32 33where 構成マスタ.M_NUM like '&製品品番' 34AND 構成マスタ.H_CODE <> 50 35 36 37union all 38 39 40SELECT DISTINCT 構成マスタ.M_NUM AS 製品品番, 41 '' AS1, 42 構成マスタ.P_NUM AS 部品品番, 43 部品名.P_NAME AS 品名, 44 構成マスタ.T AS 手配, 45 構成マスタ.H_CODE AS 保管, 46 部品アドレス.H_ADD AS アドレスN, 47 構成マスタ.U_NUM AS 原単位数, 48 '' AS 出庫指示数, 49 '' AS 出庫実績, 50 '' AS 備考, 51 '' AS 担当名, 52 A.QTY AS 帳簿在庫, 53 B.QTY AS 貸出在庫 54           55 56from 構成マスタ 57 58inner join 部品名 ON 59構成マスタ.C_NUM = 部品名.C_NUM 60inner join 部品名 ON 61構成マスタ.C_NUM = 部品名.P_NUM 62AND 構成マスタ.H_CODE = 部品アドレス.H_CODE 63left outer join (select* from 在庫 where ac_code ='1') A ON 64構成マスタ.C__NUM = A.P_NUM 65AND 構成マスタ.WH_CODE = A.WH_CODE 66left outer join (select* from 在庫 where ac_code ='6') B ON 67構成マスタ.C_NUM = B.P_NUM 68AND 構成マスタ.H_CODE = B.H_CODE 69 70where 構成マスタ.M_NUM like '&製品品番2' 71AND 構成マスタ.H_CODE <> 50 72 73 74ORDER BY アドレスN ASC,部品品番 ASC

試したこと

単純にunion allでつなげる事で 複数品番の抽出が出来ると思ったのですが、
最初にいれた品番のみが表示されてしまいます。
where旬で、複数品番入れてみたりしたのですが、全てエラーとなってしまい。。。

どなたか解決のヒントを頂けますと、幸いです。

補足情報(FW/ツールのバージョンなど)

Oracle SQL

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

内容を見るとそれぞれのunionで異なる部分は以下の条件のみです。

where 構成マスタ.M_NUM like '%製品品番' AND 構成マスタ.H_CODE <> 50 where 構成マスタ.M_NUM like '%製品品番2' AND 構成マスタ.H_CODE <> 50

%としている所は質問では&ですので置き換えています。

これは態々unionしなくてもor条件にするだけで済みます。

SQL

1where (構成マスタ.M_NUM like '%製品品番' or 構成マスタ.M_NUM like '%製品品番2') 2 AND 構成マスタ.H_CODE <> 50

複数品番の抽出が出来ると思ったのですが、最初にいれた品番のみが表示されてしまいます。

どちらかの条件に合致するものが無いだけだと思います。

投稿2021/04/22 08:45

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hk3150

2021/04/23 00:49

saziさま、おはようございます。 いつもありがとうございます。 ご回答いただいた内容のとおり、無事解決いたしました。 ありがとうございました。
sazi

2021/04/23 01:18

元のSQLが態々UNIONしているのなら、相当古いバージョンのORACLEではorをunion展開してパフォーマンスを上げるという事が、あったようなので、その名残なのかもしれませんね。
hk3150

2021/04/23 03:02

saziさま そういった事情があったのですね。 もう十何年と、誰も触らなかったブラックボックスになっており、 おかげ様で前進することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問