关于sql语句优化的问题

如题:

    

SELECT tc_pdg_file.tc_pdg10,ima_file.ima02,ima_file.ima021 
FROM tc_pdg_file,ima_file
WHERE ima_file.ima01 IN(
                           SELECT DISTINCT tc_pdj_file.tc_pdj01  
                           FROM (SELECT ima01,'3' tc_pdj02 FROM ima_file WHERE imaacti ='Y'
                           UNION
                           SELECT tc_pdi01 ima01,'1' tc_pdj02 FROM tc_pdi_file WHERE tc_pdiacti ='Y'
                           UNION
                           SELECT bmq01 ima01,'2' tc_pdj02 FROM bmq_file WHERE bmqacti ='Y') ima_file
                           LEFT OUTER JOIN tc_pdj_file 
                          ON tc_pdj_file.tc_pdj01 = ima_file.ima01 AND tc_pdj_file.tc_pdj02 = ima_file.tc_pdj02
                          WHERE ima01 IN (SELECT tc_pdj01 FROM tc_pdj_file 
                                WHERE tc_pdj_file.tc_pdj02 = ima_file.tc_pdj02 AND tc_pdj18 like '%${tc_pdj18}%'))
             AND
             tc_pdg_file.tc_pdg01 IN(
                             SELECT DISTINCT tc_pdj03 
                             FROM (SELECT ima01,'3' tc_pdj02 FROM ima_file WHERE imaacti  ='Y' 
                             UNION 
                             SELECT tc_pdi01 ima01,'1' tc_pdj02 FROM tc_pdi_file WHERE tc_pdiacti ='Y' 
                             UNION  
                             SELECT bmq01 ima01,'2' tc_pdj02 FROM bmq_file WHERE bmqacti  ='Y') ima_file
                             LEFT OUTER JOIN tc_pdj_file 
                             ON tc_pdj_file.tc_pdj01 = ima_file.ima01 
                             AND tc_pdj_file.tc_pdj02 = ima_file.tc_pdj02  
                             WHERE ima01 IN (SELECT tc_pdj01 FROM tc_pdj_file
                                WHERE tc_pdj_file.tc_pdj02 = ima_file.tc_pdj02 AND tc_pdj18 like '%${tc_pdj18}%' ) )

此sql有点长,该如何优化?

求教,感谢


尤克lili 发布于 2018-12-4 18:24
1min目标场景问卷 立即参与
回答问题
悬赏:4 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共2回答
最佳回答
0
zsh331Lv8专家互助
发布于2018-12-4 18:33

代码冗余太多~采用WITH AS子查询实现会好很多~

  • TomLi TomLi finereport里支持with as 么? 有时间试一下。
    2018-12-04 18:35 
最佳回答
0
TomLiLv2见习互助
发布于2018-12-4 18:31

把两个in改成left  join 试试,类似如下

select a.* 

from a 

inner join b on a.id = b.id

left join c on a.id = c.id

left join d on b.id = d.id

where c.value='1' and d.value='1'

另外like是否是前后百分号,如果是【aa%】会稍微好点

  • 尤克lili 尤克lili(提问者) 关于%,我也有问题需要问,能否实现如下功能:如输入 手机 华为 手机膜 这样的
    2018-12-04 18:34 
  • TomLi TomLi 回复 尤克lili(提问者) 你想展示的结果集是什么样的
    2018-12-04 18:36 
  • 3关注人数
  • 338浏览人数
  • 最后回答于:2018-12-4 18:33
    请选择关闭问题的原因
    确定 取消
    返回顶部