- - PR -
CASE文とその他結合の仕方について
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-27 18:29
はじめまして、かあどきゃぷたーと申します。
以前はdbMagicで開発経験がありますが SEとしてクエリをきるのは初めてに近いです。 ご教授いただきたいのは、下記のSQL文です。 査定テーブル(SATEI)、見積HDR(HDR)、見積DTL(DTL)を等価結合しています。 ここで会社名を取得したいのですが、 1次と2次があって、 取得条件が、2次のコードが入っていなければ、1次のコードの会社名を取得、 2次のコードが入っていれば2次のコードの会社名を取得するのですが、 うまく書けずに困っています。 SELECT SATEI.TUIKA_FLG, CASE DTL.NIZ_KRK_COM_NO WHEN '' THEN KRK.KRK_COM_RYAKU ELSE NIZ_KRK.KRK_COM_RYAKU END AS KYOURYOKU_COM, FROM KB_SB_HDR_T HDR, KB_SB_DTL_T DTL, KB_SATEI_T SATEI, KB_MS_KRK_COM_M KRK, KB_MS_KRK_COM_M NIZ_KRK WHERE SATEI.STB_NINKA_NO = '11111111' AND HDR.STB_NINKA_NO = SATEI.STB_NINKA_NO AND HDR.ORGANIZE_CD = DTL.ORGANIZE_CD AND HDR.MITSU_U_KSYO_CD = DTL.MITSU_U_KSYO_CD AND SATEI.ORGANIZE_CD = DTL.ORGANIZE_CD AND SATEI.MITSU_U_KSYO_CD = DTL.MITSU_U_KSYO_CD AND DTL.KRK_COM_NO = KRK.KRK_COM_NO AND DTL.ORGANIZE_CD = KRK.ORGANIZE_CD AND DTL.NIZ_KRK_COM_NO = NIZ_KRK.KRK_COM_NO AND DTL.ORGANIZE_CD = NIZ_KRK.ORGANIZE_CD 実際に実行すると引っかかりません。(当然だとは思うのですが) 最後の2行のところで、結合できずに引っかからないのだと思います。(2次が入っていない場合) 色々調べましたが、上手く解決できずここにたどり着きました。 上手い解決方法等アドバイスがありましたら、よろしくお願い致します。 | ||||||||
|
投稿日時: 2006-06-28 00:53
動作確認はしてませんが、こんな感じでしょうか?
DTL.NIZ_KRK_COM_NOが気になるのですが、 nullではなく、''なのでしょうか? nullであれば
* 製品名とバージョンが明記されていないので、 * SQLServer2000と仮定しています。 | ||||||||
|
投稿日時: 2006-06-28 09:22
早速の返答、ありがとうございます。
記述するのを忘れていました。 DBはOracle9iです。 参考にさせていただきつつ、頑張ってみます。 | ||||||||
|
投稿日時: 2006-06-28 12:21
やはりうまくできません。
やっぱり私のスキルがついていってないようで… | ||||||||
|
投稿日時: 2006-06-28 12:59
結合キーである2次コードが入っていない可能性があるのであれば、内結合ではなく外結合をする必要がありますね。Oracle の旧式の記述はよく知りませんが、 AND DTL.NIZ_KRK_COM_NO (+) = NIZ_KRK.KRK_COM_NO AND DTL.ORGANIZE_CD (+) = NIZ_KRK.ORGANIZE_CD こんな感じだったと思います。あと select 句の case は coalesce のほうが簡単に書けると思います。 [ メッセージ編集済み 編集者: 未記入 編集日時 2006-06-28 13:01 ] | ||||||||
|
投稿日時: 2006-06-28 16:55
SQLだけ書くと
SELECT SATEI.TUIKA_FLG ,DECODE(DTL.NIZ_KRK_COM_NO,NULL ,NIZ_KRK.KRK_COM_RYAKU,DTL.NIZ_KRK_COM_NO) KYOURYOKU_COM FROM KB_SB_HDR_T HDR, KB_SB_DTL_T DTL, KB_SATEI_T SATEI, KB_MS_KRK_COM_M KRK, KB_MS_KRK_COM_M NIZ_KRK WHERE SATEI.STB_NINKA_NO = '11111111' AND HDR.STB_NINKA_NO = SATEI.STB_NINKA_NO AND HDR.ORGANIZE_CD = DTL.ORGANIZE_CD AND HDR.MITSU_U_KSYO_CD = DTL.MITSU_U_KSYO_CD AND SATEI.ORGANIZE_CD = DTL.ORGANIZE_CD AND SATEI.MITSU_U_KSYO_CD = DTL.MITSU_U_KSYO_CD AND DTL.KRK_COM_NO = KRK.KRK_COM_NO (+) AND DTL.ORGANIZE_CD = KRK.ORGANIZE_CD (+) AND DTL.NIZ_KRK_COM_NO = NIZ_KRK.KRK_COM_NO (+) AND DTL.ORGANIZE_CD = NIZ_KRK.ORGANIZE_CD (+) でどうでしょう。 | ||||||||
1
