2016-12-14 5 views
-1

誰かがそれを実行するために多くの時間を要するとしてデカルト積を最適化することができます:SQL:デカルト積のusaugeを避ける

select c_msg.gft_id, 
     a_msg.pkSize 
from Gifts c_msg, 
     (select giftContId, 
       count(*) pkSize 
     from  Gifts gft 
     GROUP BY gft.giftContId) a_msg 
where sentDate between (sysdate-10) and (sysdate-1) 
and a_msg.giftContId = c_msg.giftContId 
order by a_msg.giftId; 
+1

明らかな解決策は、「ON」節を使用して結合条件を追加することです。つまり、これらの2つのテーブルを結合する方法はありますか? –

+1

あまり意味がありません。 Gifts.giftIdはユニークではありませんか?別のテーブルを使うつもりはありますか?そしてpkgSize、それは何の略ですか? –

+2

あなたの質問を編集し、ユニークな識別子となる情報をテーブル構造に追加してください。 – Kacper

答えて

3

私はこれは、Oracle上で動作わかりません。 postgresqlでは、次のようなことができます:

SELECT gft_id, count(*) over (partition by giftContId) as pkSize 
FROM Gifts 
WHERE sentDate between (sysdate-10) and (sysdate-1) 
ORDER BY giftId; 
+1

はい、Oracleの正しい構文であり、lookクエリはOPが必要とするものです。 – Kacper