sqlparser / gsp_demo_java

Java demos for the General SQL Parser library
122 stars 68 forks source link

joinConvert bug fix #3

Open sqlparser opened 4 years ago

sqlparser commented 4 years ago

https://github.com/sqlparser/gsp_demo_java/tree/master/src/main/java/demos/joinConvert

SQL Server

    SELECT @id_proceso, ppc.id_pv, ppc.cod_aseg, ppc.nro_cuota
    , convert(VARCHAR, mag.cod_tipo_agente) + ' ' + convert(VARCHAR, mag.cod_agente) + ' - ' + mag.txt_cheque_a_nom corredor
    , tr.txt_desc_redu ramo
    , ph.nro_pol poliza
    , min(ph.fec_emi) emision
    , min(ph.fec_vig_desde) vigencia
    , mh.txt_nom_factura contratante
    , mhp.txt_nom_factura pagador
    --smontenegro_20140818_ini
    /*, (   SELECT tc.txt_desc_cond
        FROM mpersona_conducto mpc, tconducto tc
        WHERE mpc.id_persona = mhp.id_persona
        AND mpc.ind_conducto = pp.ind_conducto
        AND tc.cod_conducto = mpc.cod_conducto) conducto*/
    ,tc.txt_desc_cond as conducto    
    --smontenegro_20140818_fin
    /*Cambia el rango de morosidad JG 24/02/2017*/        
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) < 0 THEN ppc.imp_premio_me ELSE 0 END) por_vencer
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) BETWEEN 0 AND 31 THEN ppc.imp_premio_me ELSE 0 END) dias_30
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) BETWEEN 32 AND 61 THEN ppc.imp_premio_me ELSE 0 END) dias_60
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) BETWEEN 62 AND 90 THEN ppc.imp_premio_me ELSE 0 END) dias_90
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) >= 91 THEN ppc.imp_premio_me ELSE 0 END) dias_120
    , sum(ppc.imp_premio_me) total, 0,/*bfierro */ tsuc.txt_nom_suc, convert(VARCHAR, mag.cod_agente), mag.txt_cheque_a_nom corredor,nro_dia_cobro
    FROM maseg_header mh, 
         magente mag, 
         pv_header ph, 
         tramo tr, 
         maseg_header mhp, 
         pv_pagador pp, 
         pv_pagador_cuota ppc
         --smontenegro_20140818_ini
         ,mpersona_conducto mpc
         ,tconducto tc
         --smontenegro_20140818_fin
         --bfierro ini
         ,tsuc 
         --bfierrofin

    WHERE mhp.cod_aseg      = ppc.cod_aseg
    AND pp.id_pv            = ppc.id_pv 
    AND pp.cod_aseg         = ppc.cod_aseg
    AND ph.id_pv            = ppc.id_pv 
    AND mh.cod_aseg         = ph.cod_aseg 
    AND tr.cod_ramo         = ph.cod_ramo 
    AND mag.cod_tipo_agente = ph.cod_tipo_agente 
    AND mag.cod_agente      = ph.cod_agente 
    AND ph.cod_suc          = tsuc.cod_suc --bfierro
    AND ph.cod_suc          = isnull(@cod_suc, ph.cod_suc)
    AND ph.cod_ramo         = isnull(@cod_ramo, ph.cod_ramo)
    AND ph.cod_aseg         = isnull(@cod_contratante, ph.cod_aseg)
    AND ph.cod_tipo_agente  = isnull(@cod_tipo_agente, ph.cod_tipo_agente)
    AND ph.cod_agente       = isnull(@cod_agente, ph.cod_agente)
    AND ppc.cod_aseg        = isnull(@cod_pagador, ppc.cod_aseg)
    AND ppc.cod_estado      in (1,3)
    --smontenegro_20140818_ini
    AND mhp.id_persona   *= mpc.id_persona
    AND pp.ind_conducto  *= mpc.ind_conducto
    AND tc.cod_conducto   = pp.cod_conducto
    AND tc.cod_conducto   = isnull(@cod_conducto, tc.cod_conducto)
    --smontenegro_20140818_fin    
    GROUP BY mag.cod_tipo_agente
    , mag.cod_agente
    , mag.txt_cheque_a_nom
    , tr.txt_desc_redu
    , ph.nro_pol 
    , mh.txt_nom_factura
    , mhp.txt_nom_factura
    , mhp.id_persona 
    , pp.ind_conducto
    --smontenegro_20140818_ini
    ,tc.txt_desc_cond
     --smontenegro_20140818_fin
    , ppc.id_pv
    , ppc.cod_aseg
    , ppc.nro_cuota
    , tsuc.txt_nom_suc
    ,nro_dia_cobro

转换以后的SQL

SELECT @id_proceso, ppc.id_pv, ppc.cod_aseg, ppc.nro_cuota
    , convert(VARCHAR, mag.cod_tipo_agente) + ' ' + convert(VARCHAR, mag.cod_agente) + ' - ' + mag.txt_cheque_a_nom corredor
    , tr.txt_desc_redu ramo
    , ph.nro_pol poliza
    , min(ph.fec_emi) emision
    , min(ph.fec_vig_desde) vigencia
    , mh.txt_nom_factura contratante
    , mhp.txt_nom_factura pagador
    --smontenegro_20140818_ini
    /*, (   SELECT tc.txt_desc_cond
        FROM mpersona_conducto mpc, tconducto tc
        WHERE mpc.id_persona = mhp.id_persona
        AND mpc.ind_conducto = pp.ind_conducto
        AND tc.cod_conducto = mpc.cod_conducto) conducto*/
    ,tc.txt_desc_cond as conducto    
    --smontenegro_20140818_fin
    /*Cambia el rango de morosidad JG 24/02/2017*/        
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) < 0 THEN ppc.imp_premio_me ELSE 0 END) por_vencer
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) BETWEEN 0 AND 31 THEN ppc.imp_premio_me ELSE 0 END) dias_30
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) BETWEEN 32 AND 61 THEN ppc.imp_premio_me ELSE 0 END) dias_60
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) BETWEEN 62 AND 90 THEN ppc.imp_premio_me ELSE 0 END) dias_90
    , sum(CASE WHEN datediff(day, ppc.fec_venc, @fec_corte) >= 91 THEN ppc.imp_premio_me ELSE 0 END) dias_120
    , sum(ppc.imp_premio_me) total, 0,/*bfierro */ tsuc.txt_nom_suc, convert(VARCHAR, mag.cod_agente), mag.txt_cheque_a_nom corredor,nro_dia_cobro
    FROM maseg_header mh
inner join pv_header ph on mh.cod_aseg      = ph.cod_aseg
inner join magente mag on mag.cod_tipo_agente = ph.cod_tipo_agente and mag.cod_agente       = ph.cod_agente
inner join tramo tr on tr.cod_ramo      = ph.cod_ramo
inner join pv_pagador_cuota ppc on ph.id_pv             = ppc.id_pv
inner join maseg_header mhp on mhp.cod_aseg         = ppc.cod_aseg
inner join pv_pagador pp on pp.id_pv            = ppc.id_pv and pp.cod_aseg         = ppc.cod_aseg and pp.ind_conducto  = mpc.ind_conducto
left outer join mpersona_conducto mpc on mhp.id_persona   = mpc.id_persona
inner join tconducto tc on tc.cod_conducto   = pp.cod_conducto
inner join tsuc on ph.cod_suc          = tsuc.cod_suc
         --smontenegro_20140818_ini
         --smontenegro_20140818_fin
         --bfierro ini
         --bfierrofin
    WHERE ph.cod_suc            = isnull(@cod_suc, ph.cod_suc)
    AND ph.cod_ramo         = isnull(@cod_ramo, ph.cod_ramo)
    AND ph.cod_aseg         = isnull(@cod_contratante, ph.cod_aseg)
    AND ph.cod_tipo_agente  = isnull(@cod_tipo_agente, ph.cod_tipo_agente)
    AND ph.cod_agente       = isnull(@cod_agente, ph.cod_agente)
    AND ppc.cod_aseg        = isnull(@cod_pagador, ppc.cod_aseg)
    AND ppc.cod_estado      in (1,3)
    --smontenegro_20140818_ini
    AND tc.cod_conducto   = isnull(@cod_conducto, tc.cod_conducto)
    --smontenegro_20140818_fin    
    GROUP BY mag.cod_tipo_agente
    , mag.cod_agente
    , mag.txt_cheque_a_nom
    , tr.txt_desc_redu
    , ph.nro_pol 
    , mh.txt_nom_factura
    , mhp.txt_nom_factura
    , mhp.id_persona 
    , pp.ind_conducto
    --smontenegro_20140818_ini
    ,tc.txt_desc_cond
     --smontenegro_20140818_fin
    , ppc.id_pv
    , ppc.cod_aseg
    , ppc.nro_cuota
    , tsuc.txt_nom_suc
    ,nro_dia_cobro
sqlparser commented 4 years ago

需要修复的bug

left outer join mpersona_conducto mpc on mhp.id_persona   = mpc.id_persona

应该放在

inner join pv_pagador pp on pp.id_pv            = ppc.id_pv and pp.cod_aseg         = ppc.cod_aseg and pp.ind_conducto  = mpc.ind_conducto

前,否则 mpc的引用会出错。