数据库中如何使用LEFT JOIN优化多个子查询
小编给大家分享一下数据库中如何使用LEFT JOIN优化多个子查询,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1.SQL1
OLD:
SELECTCOUNT(1)numFROM(SELECTt1.*FROMt_assett1WHERE1=1ANDt1.TYPE=0AND(t1.statusIN(1,10,11,12,100)OR(EXISTS(SELECTb.resource_idFROMt_asset_filebWHEREt1.resource_id=b.asset_codeANDt1.statusIN(3,4,8)ANDb.statusIN(1,10,11,12))))AND(EXISTS(SELECT1FROMt_asset_filea1WHEREt1.resource_id=a1.asset_codeAND(a1.content_status=1ORa1.content_status=4))ORNOTEXISTS(SELECT1FROMt_asset_filea1WHEREt1.resource_id=a1.asset_code))ORDERBYt1.create_timeDESC,t1.resource_id)a;
优化方向: 合并多个t_asset_file子查询
优化方法: 使用left join 来代替子查询,把关联列放在group by中,将子查询中不同条件使用case when
SELECTCOUNT(1)numFROM(SELECTt1.*FROMt_assett1,(SELECTasset_code,MAX(CASEWHENstatusIN(1,10,11,12)THEN1ELSE0END)status,MAX(CASEWHENcontent_status=1ORcontent_status=4THEN1ELSE0END)content_statusFROMt_asset_fileGROUPBYasset_code)t2WHEREt1.resource_id=t2.asset_code(+)ANDt1.TYPE=0AND(t1.statusIN(1,10,11,12,100)OR(t1.statusIN(3,4,8)ANDt2.status(+)=1))AND((t2.content_status(+)=1)OR(t2.asset_codeISNULL))ORDERBYt1.create_timeDESC,t1.resource_id)a;
2.SQL2
OLD:
SELECTm.khbh,d.wzzbm,wmsys.wm_concat(m.rkid)rkidsFROMm@dblinkm,d@dblinkdWHEREm.rkid=d.rkidANDm.rkzt=2ANDm.ssny<'201311'ANDm.zxdidISNULLAND(NOTEXISTS(SELECT1FROMm@dblinkm1,d@dblinkd1WHEREm1.rkid=d1.rkidANDm1.zxdid=m.rkidANDd1.wzzbm=d.wzzbmANDm1.rkzt=3)OR(SELECTSUM(d1.xysl)FROMm@dblinkm1,d@dblinkd1WHEREm1.rkid=d1.rkidANDm1.zxdid=m.rkidANDd1.wzzbm=d.wzzbmANDm1.rkzt=3)<d.xysl)GROUPBYm.khbh,d.wzzbm;
优化方向:合并重复的子查询
SELECTm.khbh,d.wzzbm,wmsys.wm_concat(m.rkid)rkidsFROMm@dblinkm,d@dblinkd,(selectm1.zxdid,d1.wzzbm,sum(d1.xysl)sum_xyslfromm@dblinkm1,d@dblinkd1wherem1.rkzt=3andm1.rkid=d1.rkidgroupbym1.zxdid,d1.wzzbm)zWHEREm.rkid=d.rkidANDm.rkzt=2ANDm.ssny<'201311'ANDm.zxdidISNULLandz.zxdid=m.rkidandz.wzzbm=d.wzzbmAND((z.zxdidisnullandz.wzzbmisnull)ORz.sum_xysl<d.xysl)GROUPBYm.khbh,d.wzzbm;
3.SQL3
OLD:
selectm.col1,d.col2,wmsys.wm_concat(m.col3)col3sfromm,dwherem.col3=d.col3andm.col6=2andm.col7<'201312'andm.col4isnulland(notexists(select1frommm1,dd1wherem1.col3=d1.col3andm1.col4=m.col3andd1.col2=d.col2andm1.col7<'201312'andm1.col6=3)or(selectsum(d1.col5)frommm1,dd1wherem1.col3=d1.col3andm1.col4=m.col3andd1.col2=d.col2andm1.col7<'201312'andm1.col6=3)<d.col5)groupbym.col1,d.col2;
优化方向:
(1).主查询和子查询涉及表相同,并且条件有很多共同点,可以考虑合并。
(2).子查询结构相似,考虑使用left join来进行合并。
NEW:
withaaas(selectm.col1,d.col2,m.col3,m.col4,d1.col5fromm,dwherem.col3=d.col3andm.col6in(2,3)andm1.col7<'201312')selectaa.col1,aa.col2,wmsys.wm_concat(aa.col3)col3sfromaa,(selectcol4,col2,sum(d1.col5)sum_col5fromaawherecol6=3groupbycol4,col2)bbwhereaa.col3=bb.col4(+)andaa.col2=bb.col2(+)andaa.col4isnullandaa.col6=2and(bb.col4isnullorbb.sum_col5(+)<aa.col5)
以上是“数据库中如何使用LEFT JOIN优化多个子查询”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。