2012-07-25 111 views
1

我有這個疑問刪除子查詢

select 
    T1.local, 
    m.Nombre as Marca, 
    T1.NombreLinea as Linea , 
    case when T1.IdComprobanteTipo in (21,23,26,28) then 0 else -sum(T1.Cantidad) end as Cantidad, 
    case when T1.IdComprobanteTipo in (21,23,26,28) 
    --toma en cuenta los descuentos de las facturas que fueron anuladas 
    then T1.TotalNeto 
    else isnull(T1.ImporteNeto,0) - isnull((select sum(importe) as importe 
              from GrimPosCon..Fact_Descuento (nolock) DD 
              where DD.IdComprobante = T1.idComprobante and T1.IdDim_Producto = IdDim_Producto 
              and T1.IdDim_Medida = IdDim_Medida and T1.IdDim_Calidad = IdDim_Calidad 
              and exists 
               (
               select 1 
                from GrimPosCon..ComprobanteReferencias (nolock) AA 
                inner join GrimPosCon..Fact_Comprobante (nolock) BB on aa.IdComprobanteCredito = BB.IdComprobante 
                where AA.IdComprobanteDebito = DD.IdComprobante 
                and BB.IdDim_ComprobanteTipo in (4,13,16,19) 
               ) 
              ),0) end as IMPORTE, 
    T1.NombreFamilia as Familia 
from 
#Query T1 
inner join GrimPosCon..Dim_Marca(nolock) m on m.IdDim_Marca = T1.IDDim_Marca 
Group by 
    T1.local, m.Nombre,T1.NombreLinea,T1.NombreFamilia,T1.TotalNeto,T1.IdComprobante, T1.IdDim_producto, 
    T1.idDim_Medida,T1.ImporteNeto,T1.IdComprobanteTipo,T1.IdDim_Calidad 

我想刪除的最大子查詢。 我試圖做Left Joins where is not null,但它給了我不同的結果。 如何修改? 我想要相同的結果,但使用一些聯接,或比那個子查詢更快的東西。按照執行計劃,子查詢需要的總查詢的%35,並在運行的所有查詢

+0

你爲什麼要刪除它?預期的結果是什麼? – 2012-07-25 15:22:42

+0

我的意思是,我想得到相同的結果,但我沒有得到子查詢,我想要做一些聯接,或者更快的一些 – 2012-07-25 15:24:24

+0

以及更具可讀性的 – 2012-07-25 15:26:02

回答

0

需要近50秒你可以試試這個查詢:

select 
    T1.local, 
    m.Nombre as Marca, 
    T1.NombreLinea as Linea , 
    case when T1.IdComprobanteTipo in (21,23,26,28) then 0 else -sum(T1.Cantidad) end as Cantidad, 
    case when T1.IdComprobanteTipo in (21,23,26,28) 
    --toma en cuenta los descuentos de las facturas que fueron anuladas 
    then T1.TotalNeto 
    else isnull(T1.ImporteNeto,0) - isnull(DD.importe,0) 
    end as IMPORTE, 
    T1.NombreFamilia as Familia 
from 
    #Query T1 
    inner join 
    GrimPosCon..Dim_Marca(nolock) m on m.IdDim_Marca = T1.IDDim_Marca 
    left join 
    (
    select 
     CC.IdComprobante, 
     CC.IdDim_Producto, 
     CC.IdDim_Medida, 
     CC.IdDim_Calidad,  
     sum(importe) as importe 
    from 
     GrimPosCon..Fact_Descuento (nolock) CC 
    where 
     exists 
     (
      select 1 
      from 
      GrimPosCon..ComprobanteReferencias (nolock) AA 
      inner join 
      GrimPosCon..Fact_Comprobante (nolock) BB on aa.IdComprobanteCredito = BB.IdComprobante 
      where 
      AA.IdComprobanteDebito = CC.IdComprobante 
      and 
      BB.IdDim_ComprobanteTipo in (4,13,16,19) 
     ) 
    group by 
     DD.IdComprobante, 
     DD.IdDim_Producto, 
     DD.IdDim_Medida, 
     DD.IdDim_Calidad 
) as DD on 
     DD.IdComprobante = T1.idComprobante 
     and 
     DD.IdDim_Producto = T1.IdDim_Producto 
     and 
     DD.IdDim_Medida = T1.IdDim_Medida 
     and 
     DD.IdDim_Calidad = T1.IdDim_Calidad 
    Group by 
    T1.local, m.Nombre,T1.NombreLinea,T1.NombreFamilia,T1.TotalNeto,T1.IdComprobante, T1.IdDim_producto, 
    T1.idDim_Medida,T1.ImporteNeto,T1.IdComprobanteTipo,T1.IdDim_Calidad,DD.importe 

它可以運行得更快或更慢取決於在你的數據上。