2012-11-06 37 views
1

我已经使用内部连接加入了两个表。这里表TPREG的主键是co_idpol_id加入Db2查询

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' 

如何让这个查询更简单吗?

请指导。

回答

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

我们所能做的就是在ANSI移动JOIN语法:

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。你应该总是使用ANSI JOIN语法,当你不期待它时会帮助你。