- PR -

SELECT文での抽出方法について

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/02/21
投稿数: 16
投稿日時: 2006-02-21 18:09
初めて書き込みさせていただきます。ORACLE8iです。

table1:
KEY1 KEY2 KEY3 tbl1_1 tbl1_2 tbl1_3
1 1 1 01 02 03
1 1 2 01 02 03

table2:
    KEY1 KEY2 KEY3 KEY4 tbl2_1
1 1 1 01 AAAAA
1 1 1 02 BBBBB
1 1 1 03 CCCCC
1 1 2 01 DDDDD

抽出結果:
result1 result2 result3
AAAAA BBBBB CCCCC
DDDDD

table1は全件取得する仕様です。
table1とtable2のKEYとtbl1_1〜3とKEY4をつき合わせて、table2のtbl2_1の項目を取得したいです。
自分で作ったSQLは以下ものです。もっとキレイにできる方法はないでしょうか?
ご教授お願い致します。


SELECT
result1,
result2,
result3
FROM
table1 A,
table2 B,
table2 C,
table2 D
WHERE A.KEY1=B.KEY1(+)
AND A.KEY2=B.KEY2(+)
AND A.KEY3=B.KEY3(+)
AND A.tbl1_1=B.KEY4(+)
AND A.KEY1=C.KEY1(+)
AND A.KEY2=C.KEY2(+)
AND A.KEY3=C.KEY3(+)
AND A.tbl1_2=C.KEY4(+)
WHERE A.KEY1=D.KEY1(+)
AND A.KEY2=D.KEY2(+)
AND A.KEY3=D.KEY3(+)
AND A.tbl1_3=D.KEY4(+)
;
かずくん
会議室デビュー日: 2006/02/21
投稿数: 9
投稿日時: 2006-02-21 20:07
コード:
SQL> select max(decode(key4, tbl1_1, tbl2_1, '')) result1

2 , max(decode(key4, tbl1_2, tbl2_1, '')) result2
3 , max(decode(key4, tbl1_3, tbl2_1, '')) result3
4 from table1 a, table2 b
5 where a.key1=b.key1(+)
6 and a.key2=b.key2(+)
7 and a.key3=b.key3(+)
8 group by a.key1, a.key2, a.key3
9 /

RESULT1 RESULT2 RESULT3
-------------------- -------------------- --------------------
AAAAA BBBBB CCCCC
DDDDD

2行が選択されました。



っていうのはどうでしょうか?


[ メッセージ編集済み 編集者: かずくん 編集日時 2006-02-23 09:11 ]
未記入
会議室デビュー日: 2006/02/21
投稿数: 16
投稿日時: 2006-02-22 09:45
ありがとうございます。
実際に自分でも確認できました。助かりました。
正直、DECODEもGROUPBYも知っていても、どういう時に使うのかが分かっていませんでした。

今回はtable2での該当データがない場合は、NULLを返す仕様なのでOKですが、
もし、「XXXXX」を返すような仕様の場合は使えませんよね?その場合はどのような
SQLになるのでしょうか?

select max(decode(key4, tbl1_1, tbl2_1, 'XXXXX')) result1
2 , max(decode(key4, tbl1_2, tbl2_1, 'XXXXX')) result2
3 , max(decode(key4, tbl1_3, tbl2_1, 'XXXXX')) result3

実際の結果:
XXXXX XXXXX XXXXX
DDDDD XXXXX XXXXX

希望抽出結果:
result1 result2 result3
AAAAA BBBBB CCCCC
DDDDD  XXXXX  XXXXX
かずくん
会議室デビュー日: 2006/02/21
投稿数: 9
投稿日時: 2006-02-22 14:57
引用:

もし、「XXXXX」を返すような仕様の場合は使えませんよね?その場合はどのような
SQLになるのでしょうか?



コード:

select min(decode(key4, tbl1_1, tbl2_1, 'XXXXX')) result1
, min(decode(key4, tbl1_2, tbl2_1, 'XXXXX')) result2
, min(decode(key4, tbl1_3, tbl2_1, 'XXXXX')) result3
from table1 a, table2 b
where a.key1=b.key1(+)
and a.key2=b.key2(+)
and a.key3=b.key3(+)
group by a.key1, a.key2, a.key3;



とすれば、

コード:

RESULT1 RESULT2 RESULT3
-------------------- -------------------- --------------------
AAAAA BBBBB CCCCC
DDDDD XXXXX XXXXX

2行が選択されました。



となります。
が、、、データに 'YYYYY' や 'ZZZZZ' があると駄目なんですよね。

なので、

コード:

select nvl(max(decode(key4, tbl1_1, tbl2_1, null)), 'XXXXX') result1
, nvl(max(decode(key4, tbl1_2, tbl2_1, null)), 'XXXXX') result2
, nvl(max(decode(key4, tbl1_3, tbl2_1, null)), 'XXXXX') result3
from table1 a, table2 b
where a.key1=b.key1(+)
and a.key2=b.key2(+)
and a.key3=b.key3(+)
group by a.key1, a.key2, a.key3;



でしょうね。

# 最初に提示したものは '' としていますが、Oracle では null となります
# 結果は同じですが今度は、明示的に null にしてます。


[ メッセージ編集済み 編集者: かずくん 編集日時 2006-02-23 09:10 ]
未記入
会議室デビュー日: 2006/02/21
投稿数: 16
投稿日時: 2006-02-22 15:07
本当にありがとうございました。
とても分かりやすい回答で納得できました。ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)