一段自己寫的很狗屎但是我還沒想到優化辦法的sql語句

<!--  宴會明細    -->
    <select id="getDetailList" resultType="java.util.Map" parameterType="java.lang.Long" >
        with returncode as (
        SELECT br.banquet_id, sum(br.success_count) as return_codes
        from yjn_banquet_return br
        WHERE 1 = 1
        and br.status = '1'
        <if test="id!=null">
            and br.banquet_id = #{id}
        </if>
        GROUP BY br.banquet_id ),secondstep as
        (
        SELECT
        yba. ID,
        banquet_id,
        audit_status,
        audit_id,
        audit_time,
        se. NAME AS audit_name
        FROM
        yjn_banquet_audit yba
        LEFT JOIN sys_employee AS se ON yba.audit_id = se. ID
        WHERE yba.status = '1'
        AND yba.audit_step = '2'
        ),firststep as(
        SELECT
        yba.ID,
        banquet_id,
        audit_status,
        audit_id,
        audit_time,
        se. NAME AS audit_name
        FROM
        yjn_banquet_audit yba
        LEFT JOIN sys_employee AS se ON yba.audit_id = se. ID
        WHERE yba.status = '1'
        AND yba.audit_step = '1'
        ),scannum as (
            SELECT yjn_scan_bottles.banquet_id,
            SUM (yjn_scan_bottles.num) AS num
            FROM
            yjn_scan_bottles
            WHERE 1 = 1
            <if test="id!=null">
               and yjn_scan_bottles.banquet_id = #{id}
            </if>
            GROUP BY
            yjn_scan_bottles.banquet_id
        )
        SELECT
        yb.ID::varchar as id,
        yb.code,
        yb.name,
        yb.banquet_type,
        coalesce(pd.name,'') as wine_name,
        yb.table_number,
        coalesce(yb.wine_number,'0') AS wine_number,
        coalesce(returncode.return_codes,'0') AS return_codes,
        coalesce(yb.wine_number,'0') - coalesce(returncode.return_codes,'0') as actual_num,
        coalesce(cm.name,'') as store_name,
        coalesce(cu.name,'') as dealer_name,
        to_char(yb.banquet_date, 'yyyy-MM-dd') as banquet_date,
        to_char(yb.end_date, 'yyyy-MM-dd') as end_date,
        yb.banquet_time,
        yb.mss_province,
        yb.mss_city,
        yb.mss_area,
        yb.address,
        yb.creator_id,
        sey.name as creator_name,
        sd.name as depe_name,
        to_char(yb.create_time, 'yyyy-MM-dd HH24:MI') as create_time,
        yb.approval_status,
        yb.wine_code,
        pd.id as product_id,
        pd.code as product_code,
        coalesce(cm.code, '') as store_code,
        coalesce(cu.code,'') as dealer_code,
        yb.consumer,
        yb.consumer_phone,
        yb.documentary_mode,
        yb.merchandiser,
        coalesce(syee.name, '') as merchandiser_name,
        yb.approver,
        coalesce(ey.name, '') as approve_name,
        coalesce(to_char(yb.approval_time,'yyyy-MM-dd HH24:MI'),'') AS approve_time,
        coalesce(ass.code, '') as exe_id,
        ybe.status as exe_status,
        coalesce(yba.code, '') as appeal_code,
        yba.approve_status as approve_status,
        yb.approval_remark,
        yb.code,
        yb.pic_path,
        yb.remarks,
        ass.assign_status,
        ybe.exe_time,
        yba.appeal_status as appeal_audit_status,
        firststep.audit_status as first_audit_status,
        secondstep.audit_status as second_audit_status,
        coalesce(scannum.num,'0') as scan_num
        FROM yjn_banquet yb
        <if test="sqlFilter != null and sqlFilter != ''" >
            ${sqlFilter}
        </if>
        left JOIN  scannum on yb.id = scannum.banquet_id
        LEFT JOIN returncode on returncode.banquet_id = yb.id
        LEFT JOIN yjn_banquet_appeal      yba 				on yb.id = yba.banquet_id and yba.appeal_status != '0'
        LEFT JOIN yjn_banquet_assign      ass 				on yb.id = ass.banquet_id
        LEFT JOIN yjn_banquet_exe         ybe 				on yb.id = ybe.banquet_id
        LEFT JOIN sys_employee            ey 				on yb.approver = ey."id" AND ey.status = '1'
        LEFT JOIN sys_employee            sey 				on yb.creator_id = sey."id" AND sey.status = '1'
        left join sys_department          sd               on sey.dept_id = sd.id and sd.status = '1'
        LEFT JOIN sys_employee            syee 				on yb.merchandiser = syee."id" AND syee.status = '1'
        LEFT JOIN bas_pd_product          pd 				on yb.product_id = pd.id
        LEFT JOIN bas_cm_customer         cu 				on yb.dealer_id = cu.id AND cu.status = '1'
        LEFT JOIN bas_cm_customer         cm 				on yb.store_id = cm.id AND cm.status = '1'
        LEFT JOIN secondstep on yb.id = secondstep.banquet_id
        LEFT JOIN firststep on yb.id = firststep.banquet_id
        WHERE 1=1
        and yb.status = '1'
        <if test="id!=null">
            and yb.ID = #{id}
        </if>
        <if test="codeOrName !=null and codeOrName !=''">
            and (yb.name like '%${codeOrName}%' OR yb.code like '%${codeOrName}%')
        </if>
        <if test="storeId!=null">
            and cm.ID in
            <foreach collection="storeId" open="(" separator="," close=")" item="index">
                #{index}::int8
            </foreach>
        </if>
        <if test="delearId !=null">
            and cu.ID in
            <foreach collection="delearId" open="(" separator="," close=")" item="index">
                #{index}::int8
            </foreach>
        </if>
        <if test="approvalArea!=null and approvalArea!=''">
            and (coalesce(yb.mss_province,-1) in (${approvalArea}) and coalesce(yb.mss_city,-1) in (${approvalArea}) and coalesce(yb.mss_area,-1) in (${approvalArea}) )
        </if>
        <if test="banquetWine!=null">
            and pd.id in
            <foreach collection="banquetWine" open="(" separator="," close=")" item="index">
                #{index}::int8
            </foreach>
        </if>
        <if test="approval_status!=null and approval_status!=''">
            and yb.approval_status in
            <foreach collection="approval_status" open="(" separator="," close=")" item="index">
                #{index}
            </foreach>
        </if>
        <if test="banquetType!=null">
            and yb.banquet_type in
            <foreach collection="banquetType" open="(" separator="," close=")" item="index">
                #{index}::INT8
            </foreach>
        </if>
        <if test="start_date != null and start_date != ''">
            and to_char(yb.create_time,'yyyy-MM-dd') &gt;= #{start_date,jdbcType=TIMESTAMP}
        </if>
        <if test="end_date != null and end_date != ''">
            and to_char(yb.create_time,'yyyy-MM-dd') &lt;= #{end_date,jdbcType=TIMESTAMP}
        </if>
        <if test="beginTime !=null and beginTime!='' and endTime != null and endTime != ''">
            <![CDATA[
			and  (
			( to_char(yb.banquet_date,'yyyy-MM-dd') <=#{beginTime} and to_char(yb.end_date,'yyyy-MM-dd') >=#{beginTime})
			or ( to_char(yb.banquet_date,'yyyy-MM-dd') <= #{endTime} and to_char(yb.end_date,'yyyy-MM-dd') >= #{endTime})
			or ( to_char(yb.banquet_date,'yyyy-MM-dd') <= #{endTime} and to_char(yb.end_date,'yyyy-MM-dd') >= #{beginTime} )
			)
			]]>
        </if>
        ORDER BY  yb.create_time DESC
    </select>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章