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

SQLの書き方について質問です。
マスタにある項目CDはすべて表示。そこにデータ項目を表示させる。マスタにある項目CDがデータにない場合は、表示できない部分以外はNULLで表示させるにはどうしたらよいのでしょうか?
思うようにデータが取得できません。ORACLE8iです。
例えば
select * from マスタ
where データCD = '0009' の結果が

+-------------------------------------+
+ データCD | SEQ番号 | 項目CD | 項目名 |
+-------------------------------------+
0009 | 1 | 05000 | 名称1
0009 | 2 | 05100 | 名称2
0009 | 3 | 05200 | 名称3

で、
select * from データ
and データ.本支所CD = '999'
and データ.部門CD = '99' の結果が

+------------------------------------------+
+ 本支所CD | 部門CD | 項目CD | 発生額07月 |
+------------------------------------------+
999 | 99 | 05000 | 1,234
999 | 99 | 05100 | 1,235

だった場合、

select
SEQ番号,
本支所CD,
マスタ.項目CD,
マスタ.項目名,
発生額07月
from マスタ,データ
where マスタ.データCD = '0009'
and マスタ.項目CD = データ.項目CD
and データ.本支所CD = '999'
and データ.部門CD = '99'
を実行すると、

+--------------------------------------------------------+
| SEQ番号 | 本支所CD | 部門CD | 項目CD | 項目名 | 発生額07月 |
+--------------------------------------------------------+
| 1 | 999 | 99 |05000 | 名称1 | 1,234
| 2 | 999 | 99 |05100 | 名称2 | 1,235
+--------------------------------------+
と結果が返ってきますが、

+-------------------------------------------------------+
| SEQ番号 | 本支所CD | 部門CD | 項目CD | 項目名 | 発生額07月 |
+-------------------------------------------------------+
| 1 | 999 | 99 |05000 | 名称1 | 1,234
| 2 | 999 | 99 |05100 | 名称2 | 1,235
| 3 | 999 | 99 |05200 | 名称3 | NULL
+--------------------------------------+
とするためには
どういうSQLを作成したらよいのでしょうか?
「where マスタ.データCD(+) = '0009'
and マスタ.項目CD = データ.項目CD(+)
and データ.本支所CD(+) = '999'
and データ.部門CD(+) = '99' 」
にしてもだめでした。
※「マスタに存在して、データに存在しない項目コードがありますが、
それも発生額07月はNULLでよいので、それ以外の項目をすべて表示したい」のです。

説明不足だとは思いますが、どなたかご教授のほどよろしくお願いいたします。相当行き詰ってます。

A 回答 (3件)

No.2です。


下記のような結果でもいいのであれば、こんな感じでいけると思います。

+-------------------------------------------------------+
| SEQ番号 | 本支所CD | 部門CD | 項目CD | 項目名 | 発生額07月 |
+-------------------------------------------------------+
| 1 | 999 | 99 |05000 | 名称1 | 1,234
| 2 | 999 | 99 |05100 | 名称2 | 1,235
| 3 | NULL|NULL|05200 | 名称3 | NULL
+--------------------------------------+

select
マスタ.SEQ番号,
data.本支所CD,
data.部門CD,
マスタ.項目CD,
マスタ.項目名,
data.発生額07月
from マスタ,(
select * from データ where 本支所CD = '999'
and 部門CD = '99'
) as data
where マスタ.データCD = '0009'
and マスタ.項目CD = data.項目CD(+)

>どうしても出したいのであれば項目に固定値を入れるとかしないとダメかも……)
無理矢理提示された結果を出すのなら、本支所CD,部門CDの項目ではなく、'999','99'を代わりに指定したら同じ結果は出るかなと思って書きました。
絞り込みたいのであればダメですね。
気にしないでください(笑)

#ちなみに8iはleft join使えないみたいです。
    • good
    • 0
この回答へのお礼

ありがとうございます!
教えてもらったとおりにやって、
なんとか出来ました!!
ちなみに、「as data」では
動かなかったので、下記のように修正しました。

select
マスタ.SEQ番号,
data.本支所CD,
data.部門CD,
マスタ.項目CD,
マスタ.項目名,
data.発生額07月
from マスタ,(
select * from データ where 本支所CD = '999'
and 部門CD = '99'
) data
where マスタ.データCD = '0009'
and マスタ.項目CD = data.項目CD(+)

これでようやく先週から悩んでいた問題が解決しました。
やっと業務が進みます。
今回はお手数かけました。
どうもありがとうございました。

お礼日時:2007/09/12 16:29

>マスタにある項目CDはすべて表示。

そこにデータ項目を表示させる。マスタにある項目CDがデータにない場合は、表示できない部分以外はNULLで表示させるにはどうしたらよいのでしょうか?

とのことですが、

+-------------------------------------------------------+
| SEQ番号 | 本支所CD | 部門CD | 項目CD | 項目名 | 発生額07月 |
+-------------------------------------------------------+
| 1 | 999 | 99 |05000 | 名称1 | 1,234
| 2 | 999 | 99 |05100 | 名称2 | 1,235
| 3 | 999 | 99 |05200 | 名称3 | NULL
+--------------------------------------+

この結果を望んでいるとなると若干違いませんか?
本支所CD・部門CDはデータテーブルから取得しているのでNULLになると思うのですが。

select
SEQ番号,
本支所CD,
部門CD,
マスタ.項目CD,
マスタ.項目名,
発生額07月
from マスタ,データ
where マスタ.データCD = '0009'
and マスタ.項目CD = データ.項目CD(+)

上記で結合は可能です。
(本支所CD・部門CDで絞り込むとNULLのレコードが消えてしまうので条件から外しています。
どうしても出したいのであれば項目に固定値を入れるとかしないとダメかも……)

この回答への補足

回答ありがとうございます!

>この結果を望んでいるとなると若干違いませんか?
>本支所CD・部門CDはデータテーブルから取得しているのでNULLになると思うのですが。

はい、確かにそうなんですが、件数が多い為どうしても絞って結果に出したいのです。

>どうしても出したいのであれば項目に固定値を入れるとかしないとダメかも……)

実際にどのように書いたらよろしいでしょうか?
サンプルなど載せていただけますと助かるのですが・・・

補足日時:2007/09/12 11:59
    • good
    • 0

(+)には制限があるようで、書き方によっては上手く動かないようです。



from マスタ left join データ on マスタ.項目CD = データ.項目CD
where マスタ.データCD = '0009'
and データ.本支所CD = '999'
and データ.部門CD = '99'

と書いてみてはいかがでしょうか?

この回答への補足

ありがとうございます。
早速試したところ、
「SQLが正しく終了していません」と出ました。
Oracleに「join」は使用できるのでしょうか?

補足日時:2007/09/12 11:40
    • good
    • 0

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