2017-11-07 14 views
0

私は大部分のクエリをcteとして開発しましたが、特定の部分では、処理されるレコードの数を最小限に抑えるために内部結合を使用して2次テーブルの合計を作成する必要がありました。集計レコードの一部がpostgresql内部結合いくつかのレコードを複製する

私は内部使用する必要が8回は参加したり、応答時間が15倍以上の倍

with 
p0 as (select distinct on (pventa) pventa, p.tipo tpva from lecturas l 
    left join puntoventa p on l.pventa=p.numero where dia between '2017-10-01' and '2017-10-31' and p.tipo in ('A','E')), 

r1 as (select p.tpva, l.pventa, dia, turno from lecturas l 
     inner join p0 p on p.pventa=l.pventa 
     where dia between '2017-10-01' and '2017-10-31'), 

p1 as (select pva, remision, sum(abono), count(abono) from pagosremisiones p 
     inner join movsgas m on p.pva=m.pventa and p.remision=m.folio 
     inner join r1 r  on r.pventa=m.pventa and r.dia=m.dia and r.turno=m.turno group by 1,2 order by 1,2), 

f1 as (select c.serie, c.factura, sum(abono), count(abono) from chequefactura c 
     inner join movsgas m on c.serie=m.serie and c.factura=m.factura  
     inner join r1 r  on r.pventa=m.pventa and r.dia=m.dia and r.turno=m.turno group by 1,2 order by 1,2) 

select * from p1 

Npremによって空に撮影され、ためにncheckをデバッグしている重複

P 1とf1はr1に依存しますが、p1は重複したレコード(npremは既存のレジスタに対応します)なしで動作しますが、ncheckは実際の値の8倍まで増加します

私はそう、正しいP1の結果が純粋にカジュアルであり、F1

で重複を修正する方法がわからない場合、私は直接サブクエリを行うための代替手段を持っていますが、私は使用することに教訓的な関心がところで

に参加していわかりません直接的なサブクエリは、構造が不十分なために結合よりもはるかに効率的です

私は間違って何をしていますか?

コードを最適化するにはどうすればよいですか?予め

おかげ

ホセ

+0

それはかなり不明です。より簡単なクエリと、問題を示すサンプルデータを簡単に再現することができますか? –

+0

申し訳ありませんLawrewnz、ここではかなり大きかった – glicuado

+0

コードはオプトマイズされていない、または重複しているという問題/質問ですか?今はちょうど一連のサブクエリです。重複を取得している場合は、参加しているものが少なくとも1つの結合されたテーブル/サブクエリで一意ではないことが示唆されます。すべてのデータを見ることなく、データの問題として診断する方法はありません。さらに、あなたの 'f1' CTEが書かれているように、余分です。それはなぜここに含まれていますか?それは非常に混乱しています。 – JNevill

答えて

0

必要なトリックは、私はそれを省略した場合、エラーが解消され、[(セリエ、factura)上の異なる]を含む新たなサブクエリR2です。 r2の重複はf1の重複の数に対応していないので、どこから来たのか分かりませんでした。私の問題の恐ろしい記述のためのすべてのそして再び謝罪ありがとう

with 
p0 as (select distinct on (pventa) pventa, p.tipo tpva from lecturas l 
    left join puntoventa p on l.pventa=p.numero where dia between '2017-10-01' and '2017-10-31' and p.tipo in ('A','E')), 

r1 as (select p.tpva, l.pventa, dia, turno from lecturas l 
     inner join p0 p on p.pventa=l.pventa 
     where dia between '2017-10-01' and '2017-10-31'), 

r2 as (select distinct on (serie, factura) m.serie,m.factura from movsgas m 
     inner join chequefactura c on c.serie=m.serie and c.factura=m.factura 
     inner join r1 r on r.pventa=m.pventa and r.dia=m.dia and r.turno=m.turno), 

p1 as (select pva, remision, sum(abono) payp from pagosremisiones p 
     inner join movsgas m on p.pva=m.pventa and p.remision=m.folio 
     inner join r1 r  on r.pventa=m.pventa and r.dia=m.dia and r.turno=m.turno group by 1,2 order by 1,2), 

f1 as (select c.serie, c.factura, sum(abono) payfr2, count(*) from chequefactura c 
     inner join r2 r  on r.serie=c.serie and r.factura=c.factura group by 1,2 order by 1,2) 
関連する問題