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

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

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

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

SQL

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

Q&A

3回答

1573閲覧

Oracle:SQLで表2つを結合させたい ※追記しました

shark15

総合スコア0

Oracle

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

SQL

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

0グッド

0クリップ

投稿2020/09/17 04:50

編集2020/09/17 08:20

OracleでSQLを使って表AとBを外部結合させたいです。
例えば下のような表AとBをその下のような実行結果にしたいです。

|表A

code_aname
1A
2B
3C
4D

|表B

code_bprice
1100
2200

|実行結果

codenameprice
1A100
2B200
3C(null)
4D(null)

(出来ればcode3とcode4のpriceは、nullではなく「0」を表示させたいです。)

select code_a as code, name, price from A left outer join B on A.code_a=B.code_b

で実行してみましたが、
code1とcode2の2行しか結果しかでませんでした。
表Aのcodeとnameをすべて表示させるにはどのようにしたらいいでしょうか?
どうか知恵をお貸しください。
(実際はもっと列があり、where句で対象年と対象項目を指定したりしていますが
関係ないと思うので省いています)

OracleはSL Object Browser for Oracle Ver.12(32bit)です。
Oracle Databaseは 12.1.0.1.0 でした。
Windows 10 Proです。

追記

|出来ればcode3とcode4のpriceは、nullではなく「0」を表示させたいです。

ここに注目しないでください。
この文は外部結合が思うようにいった時に「ついでに」という話なので
外部結合等を使ってcodeをすべて表示させつつ、表AとBを結合させる方法を
先に教えてほしいです。

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

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

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

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

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

Orlofsky

2020/09/17 04:52

コードは英語では code です。
shark15

2020/09/17 04:54

すみません、SQLだけでなく英語も初心者でした。 修正します。有難うございます。
Orlofsky

2020/09/17 04:54

price の単語も覚えましょう。
Orlofsky

2020/09/17 04:57

> OracleはSL Object Browser fro Oracle Ver.12(32bit)です。 質問にOracle Database のバージョンは明記してください。
Orlofsky

2020/09/17 04:59

> select code_a as code name price select code_a as code, name, price , を省略するとエラーになりますが。
shark15

2020/09/17 05:00

codeの修正中にpriceも気付きました…。 すみませんが本当に初心者で、 Databaseのバージョン、とはどこで見れますか?
Orlofsky

2020/09/17 05:06

sysユーザーで接続して、 SELECT VERSION FROM V$INSTANCE ;
shark15

2020/09/17 05:11

SELECTのカンマは私の入力漏れです。 SQLで実行した際には入力していたのでエラーは出ずに、2行の結果が返ってきました。 バージョンわかりました、ありがとうございます。
Orlofsky

2020/09/17 05:19

PCはWindows 10 Home Premium 32bit を使っていませんか?質問に明記してください。
shark15

2020/09/17 06:00

Windows10は間違いないですが、以降はわからないです。 どこかでみれますか? Oracleが32bitなのはWindows7のOracleが32bitだったのでいけるかな?って感じで入れました。
Orlofsky

2020/09/17 06:04

エクスプローラで[PC]をマウス右ボタンで[プロパティ]
shark15

2020/09/17 06:10

Windows 10 Pro でした。 修正します。 有難うございます。
Orlofsky

2020/09/17 06:43

質問毎にOS環境やソフトウェアのバージョンを明記できると問題の解決が早いです。 勉強用でしたら、Oracle Database 18c Express Edition https://qiita.com/nakaie/items/2e383d4916530dce6a4f がありますが、Windows10 professional, 64bit が必要です。
shark15

2020/09/17 08:26

ありがとうございます。 そのようにします。
guest

回答3

0

where句で表Bに対して条件を指定していませんか?
だとすると外部結合は機能しませんので、表Bを予め絞り込んだサブクエリにする必要があります。
例えば表Bをyear=2020で絞り込む場合のSQLは下記になります。

SQL

1select code_a as code, name, price 2from A left outer join (select code_b, price from B where year = 2020) as B on A.code_a=B.code_b

見当違いだったらごめんなさい。

投稿2020/09/17 07:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shark15

2020/09/17 08:17

>where句で表Bに対して条件を指定していませんか? 回答有難うございます。 WHERE句、表Bを指定してました。 修正してSQLを実行しましたが、「キーワードがありません」と出ました。 このエラー文は ON句 がちゃんと指定できていないときに見たことがあるエラーですが 綴り等は間違えていませんでした。 他に原因は何が考えられるでしょうか…?
退会済みユーザー

退会済みユーザー

2020/09/17 08:44

可能であれば修正後のSQLを質問に追記していただけますか。 先程は推測で回答しましたが、構文エラーは全文読まないとチェックできませんので。 業務上不可能なのであれば、シンプルなSQLにひとつづつ条件を追加していき、どこで怒られているのかを突き止めてください。
shark15

2020/09/17 09:02

表名、列名ごまかしてますが下記のような感じです。 名前だけ仮置きしているのでSQL構文はエラーが出たものをそのまま持ってきました SELECT A.コード,A.項目,B.年月,B.コード,B.名前,B.値1 FROM A LEFT OUTER JOIN (SELECT 年月,コード,名前,値1 FROM B WHERE 年月=2020 AND 名前='▽▽') AS B ON A.コード=B.コード ORDER BY A.コード
退会済みユーザー

退会済みユーザー

2020/09/17 09:32

私が趣味で作ってるDBに合わせてテーブル名と列名を書き換えて実行しましたが、期待通りの結果を得ることができました。 SELECT * FROM duty_divisions AS A LEFT OUTER JOIN (SELECT * FROM duty_division_of_date WHERE date='2020-01-01' AND comment='COMMENT') AS B ON A.id=B.duty_divisioln_id ORDER BY A.display_order ですので構文エラーではないようですが、なんのキーワードがないのか・・・お役に立てずすみません。
shark15

2020/09/18 04:49

構文が間違っていないことがわかっただけでも助かりました。 昨夜色々考えてみたのですが、 「LEFT OUTER JOIN で表Bに該当しない項目を NULL で表示した後に年月の抽出を行っているため、 抽出条件じゃない年月で表Aのコードがすべて表示されている扱いになっている →年月を指定してもすべてのコードが抽出されない」 ということではないのかと思いました。 サブクエリはなぜか「SQLが正しく終了されていません」(必要なところに列名等がないというエラー?)が表示されるので、もう少し詳しく調べてみようと思います。 ありがとうございました。
guest

0

標準SQLであるCOALESCEの方をお薦めします。(NVLは独自関数であるし2択なので)
NVL、COALESCE

上記はNullかどうかの判断に特化した関数ですけど、CASEでも同じことは出来ます。
条件が複雑になるような場合は、CASEを使用すると良いでしょう。
CASE 式
※oracle独自のDecodeもありますけどCASE式をお薦めします。

追記

|出来ればcode3とcode4のpriceは、nullではなく「0」を表示させたいです。

ここに注目しないでください。
この文は外部結合が思うようにいった時に「ついでに」という話なので
外部結合等を使ってcodeをすべて表示させつつ、表AとBを結合させる方法を
先に教えてほしいです。

質問に記載されている内容では間違えようがありません。

SQL

1select A.code_a as code, A.name, Coalesce(B.price, 0) as price 2from A left join B 3 on A.code_a = B.code_b

他の方のコメントでwhere条件の記述がありましたが、抽出する為の条件としては結合条件だけではなくwhere条件も必要です。
ひょっとして、結合しているテーブルも質問では省略したりしていませんか?

投稿2020/09/17 05:04

編集2020/09/17 08:37
sazi

総合スコア25327

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

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

shark15

2020/09/17 05:15

COALESCE は初めて知ったので詳しく調べて活用したいと思います。 CASE も状況に応じて使い分けます。有難うございます。
guest

0

出来ればcord3とcord4のpriseは、nullではなく「0」を表示させたいです。

ヒントはNVL。SQL言語リファレンスを調べてください。

投稿2020/09/17 04:57

Orlofsky

総合スコア16417

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

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

shark15

2020/09/17 05:06

NVL、NVL2 等はわかるのですが、結合と同時に可能でしょうか? 結果がそもそも表示されないので試すことができないのですが、 NVLを使うとしたら↓こうですかね…? select code_a as code,name,nvl(price,0)
Orlofsky

2020/09/17 06:33

2つ不安な点があります。 Oracle Database 12.1.0.1.0 は初期インストールされたままで全くパッチが適応されていません。また、そろそろどんなに大きなバグが発生しようとオラクル社は新たパッチは作ってくれない古いバージョンになります。サポート契約していればパッチの入手が可能ですし、オラクルのライセンスのバージョンアップも無料です。 ソフトウェア要件を満たしていないと色々な誤動作をします。 OUTER JOIN 外部結合 で正常に動作しないのはソフトウェア要件を満たしてないせいでは? Oracle12.1 Database インストレーション・ガイド for Microsoft Windows ソフトウェア要件 https://docs.oracle.com/cd/E57425_01/121/NTDBI/reqs.htm#CHDHGGFE Oracle12.1 Database Client インストレーション・ガイド for Microsoft Windows 32-bit, x64 ソフトウェア要件 https://docs.oracle.com/cd/E57425_01/121/NTCLI/pre_install.htm#CIHIAGFG
shark15

2020/09/17 08:25

ありがとうございます。 サポート契約やパッチについて確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問