- PR -

CASE文とその他結合の仕方について

1
投稿者投稿内容
かあどきゃぷたー
ベテラン
会議室デビュー日: 2006/06/27
投稿数: 62
お住まい・勤務地: 東京都、ちょっとお隣がすぐ千葉県のところ
投稿日時: 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次が入っていない場合)

色々調べましたが、上手く解決できずここにたどり着きました。
上手い解決方法等アドバイスがありましたら、よろしくお願い致します。
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-06-28 00:53
動作確認はしてませんが、こんな感じでしょうか?
コード:
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_SATEI_T SATEI
        INNER JOIN
        KB_SB_HDR_T HDR
        ON  HDR.ORGANIZE_CD     =  SATEI.ORGANIZE_CD
        AND HDR.MITSU_U_KSYO_CD =  SATEI.MITSU_U_KSYO_CD
        AND HDR.STB_NINKA_NO    =  SATEI.STB_NINKA_NO
        INNER JOIN
        KB_SB_DTL_T DTL
        ON  DTL.ORGANIZE_CD     =  SATEI.ORGANIZE_CD
        AND DTL.MITSU_U_KSYO_CD =  SATEI.MITSU_U_KSYO_CD
        LEFT OUTER JOIN
        KB_MS_KRK_COM_M KRK
        ON  KRK.KRK_COM_NO      =  DTL.KRK_COM_NO
        AND KRK.ORGANIZE_CD     =  DTL.ORGANIZE_CD
        LEFT OUTER JOIN
        KB_MS_KRK_COM_M NIZ_KRK
        ON  KRK.KRK_COM_NO      =  DTL.NIZ_KRK_COM_NO
        AND KRK.ORGANIZE_CD     =  DTL.ORGANIZE_CD
WHERE   SATEI.STB_NINKA_NO      =  '11111111'


DTL.NIZ_KRK_COM_NOが気になるのですが、
nullではなく、''なのでしょうか?
nullであれば
コード:
        CASE
        WHEN DTL.NIZ_KRK_COM_NO IS NULL
                THEN KRK.KRK_COM_RYAKU
                ELSE NIZ_KRK.KRK_COM_RYAKU
        END     AS KYOURYOKU_COM



* 製品名とバージョンが明記されていないので、
* SQLServer2000と仮定しています。
かあどきゃぷたー
ベテラン
会議室デビュー日: 2006/06/27
投稿数: 62
お住まい・勤務地: 東京都、ちょっとお隣がすぐ千葉県のところ
投稿日時: 2006-06-28 09:22
早速の返答、ありがとうございます。
記述するのを忘れていました。
DBはOracle9iです。

参考にさせていただきつつ、頑張ってみます。
かあどきゃぷたー
ベテラン
会議室デビュー日: 2006/06/27
投稿数: 62
お住まい・勤務地: 東京都、ちょっとお隣がすぐ千葉県のところ
投稿日時: 2006-06-28 12:21
やはりうまくできません。
やっぱり私のスキルがついていってないようで…
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2006-06-28 12:59
引用:
取得条件が、2次のコードが入っていなければ、1次のコードの会社名を取得、 2次のコードが入っていれば2次のコードの会社名を取得する


結合キーである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/02/23
投稿数: 25
投稿日時: 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

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