1

内部結合を使用して2つのテーブルを結合しました。ここで、テーブルの主キーTPREGco_idpol_id

 SELECT (SELECT etbl_desc_txt
       FROM uding604.tedit e
       WHERE etbl_typ_id = 'PITCD'
       AND   co_id = 'CP'
       AND   etbl_valu_id = p.pol_ind_typ_cd) pol_ind_typ_cd,
       (SELECT etbl_desc_txt
        FROM uding604.tedit e
        WHERE etbl_typ_id = 'PAYT'
        AND   co_id = 'CP'
        AND   etbl_valu_id = p.POL_BILL_TYP_CD) POL_BILL_TYP_CD,
       POL_PAC_DRW_DY,
       (SELECT etbl_desc_txt
        FROM uding604.tedit e
        WHERE etbl_typ_id = 'PAYM'
        AND   co_id = 'CP'
        AND   etbl_valu_id = p.POL_BILL_MODE_CD) POL_BILL_MODE_CD,
       t.SOURCE_CD
FROM uding604.tpol p,
     uding604.TPREG t
WHERE p.co_id = t.co_id
AND   p.pol_id = t.pol_id
AND   p.co_id = 'CP'
AND   p.pol_id = '000000011'
AND   t.co_id = 'CP'
AND   t.pol_id = '000000011'

このクエリをより簡単にする方法は?

ご案内ください。

4

1 に答える 1

2

サブクエリを結合に変換できます。

SELECT e1.etbl_desc_txt as pol_ind_typ_cd,
       e2.etbl_desc_txt as POL_BILL_TYP_CD,
       POL_PAC_DRW_DY,
       e3etbl_desc_txt as POL_BILL_MODE_CD,
       t.SOURCE_CD
FROM uding604.tpol p,
     uding604.TPREG t,
     uding604.tedit e1,
     uding604.tedit e2,
     uding604.tedit e3
WHERE p.co_id = t.co_id
AND   p.pol_id = t.pol_id
AND   p.co_id = 'CP'
AND   p.pol_id = '000000011'
AND   t.co_id = 'CP'
AND   t.pol_id = '000000011'
AND   e1.etbl_typ_id = 'PITCD'
AND   e1.co_id = 'CP'
AND   e1.etbl_valu_id = p.pol_ind_typ_cd
AND   e2.etbl_typ_id = 'PAYT'
AND   e2.co_id = 'CP'
AND   e2.etbl_valu_id = p.POL_BILL_TYP_CD
AND   e3.etbl_typ_id = 'PAYM'
AND   e3.co_id = 'CP'
AND   e3.etbl_valu_id = p.POL_BILL_MODE_CD

クエリは句でより明確になりますが、select句であいまいWhereです。

私たちにできることは、ANSIJOIN構文に進むことです。

SELECT e1.etbl_desc_txt as pol_ind_typ_cd,
       e2.etbl_desc_txt as POL_BILL_TYP_CD,
       POL_PAC_DRW_DY,
       e3etbl_desc_txt as POL_BILL_MODE_CD,
       t.SOURCE_CD
FROM uding604.tpol p 
JOIN uding604.TPREG t on (p.co_id = t.co_id AND p.pol_id = t.pol_id)
JOIN uding604.tedit e1 on (e1.etbl_valu_id = p.pol_ind_typ_cd and e1.co_id = p.co_id)
JOIN uding604.tedit e2 on (e2.etbl_valu_id = p.POL_BILL_TYP_CD and e2.co_id = p.co_id)
JOIN uding604.tedit e3 on (e3.etbl_valu_id = p.POL_BILL_MODE_CD and e3.co_id = p.co_id)
WHERE p.co_id = 'CP'
AND   p.pol_id = '000000011'
AND   t.co_id = 'CP'
AND   t.pol_id = '000000011'
AND   e1.etbl_typ_id = 'PITCD'
AND   e2.etbl_typ_id = 'PAYT'
AND   e3.etbl_typ_id = 'PAYM'

今、あなたが望むものがより明確になります。

注1。あなたは削除しようとするかもしれません

AND   t.co_id = 'CP'
AND   t.pol_id = '000000011'

必ずしも論理ではないからです。

注2。これらのクエリがクエリと同じものを返すかどうかをテストする必要があります。

注3。常にANSIJOIN構文を使用する必要があります。これは、予期しない場合に役立ちます。

于 2012-11-06T07:05:07.313 に答える