在编写高效的SQL查询时需要帮助

时间:2015-04-02 15:38:14

标签: mysql sql perl

我有以下查询,写在perl脚本中:

        insert into #temp_table
        select distinct bv.port,bv.sip,avg(bv.bv) bv, isnull(avg(bv.book_sum),0) book_sum,
        avg(bv.book_tot) book_tot,
        check_null = case when bv.book_sum = null then 0 else 1 end         
        from table_bv bv, table_group pge, table_master sm
        where pge.a_p_g = '$val'
        and pge.p_c = bv.port
        and bv.r = '$r'
        and bv.effective_date = '$date'
        and sm.sip = bv.sip

查询继续 - 下面需要帮助(有人可以帮助我提高效率,或重写,我在想它的错误)

   and ((sm.s_g = 'FE')OR(sm.s_g='CH')OR(sm.s_g='FX')
   OR(sm.s_g='SH')OR(sm.s_g='FD')OR(sm.s_g='EY')
   OR ((sm.s_t = 'TA' OR sm.s_t='ON')))

查询继续在

下面
       group by bv.port,bv.sip

查询结束

解释:包含sip的一些$ val s_g('FE','CH','FX','SH','FD','EY')和 s_t('TA','ON')将book_sum设为null。 temp_table不带空值, 因此我将它们插入为零(isnull(avg(bv.book_sum),0)),只要它遇到以下s_g和s_m的空值。

我已尝试按如下方式进行查询,但它使我的脚本停止工作:

and sm.s_g in ('FE', 'CH','FX','SH','FD','EY') 
or sm.s_t in ('TA','ON')` 

1 个答案:

答案 0 :(得分:2)

我知道这应该是评论,但我没有代表。对我来说,它看起来像是悬挂,因为你最后丢失了你的分组。我认为应该是:

and ( 
    sm.s_g in ('FE', 'CH','FX','SH','FD','EY') 
    or 
    sm.s_t in ('TA','ON')
)

请注意括号。否则,你要求所有早期条件,或者sm.s_t是TA或ON之一,这是一个比你预期的更大的集合,这可能会导致它旋转。