2017-09-06 8 views
0

私はPL/SQLとOracle SQLのクエリが初めてです。別のクエリで1つのOracleクエリのデータを反復処理する方法。

達成しようとしていることはありますか?
ラベル「600」の今日から最後の100日目に出荷されたすべてのボックス(sysdate-100)を取得します。これらのボックスのうち、「50」と「51」のラベルが更新されたボックスを分離する必要があります。

ロジック:
1.ラベル「600」で最後の100分に出荷されたすべての箱を入手します。また、ラベル「600」で最後の100日間に出荷された数を取得します。 (例えば、今日は09/06、05/29に出荷されるすべてのボックスを入手してください) 2.更新されたラベルを持つすべてのボックスの数を取得します。 E.G、06/01に「600」→「50」のボックスの1つが移動したので、このボックスを検討する必要があります。

私はこのユースケースのためにPL/SQLを書こうとしていますが、これまでになっています。

VARIABLE box_id CHAR(50); 

    BEGIN 
     FOR box_id IN (SELECT 
     box_id, box_lable 
     FROM 
     my.box_table 
     WHERE box_lable = '600' 
     AND trunc(boxed_date) = trunc(SYSDATE - 100) 
     ) LOOP 

     select count(*), box_lable 
     from my.shipping_info si 
     where box_id = si.box_id 
     and box_lable in ('51', '50') 
     group by box_lable 

--COde to print the count of box_label = 600; count of box_label = 51; count of box_label = 50 . 

    END LOOP; 
END; 

上記のコードでは、SQL Developerでエラーが発生しています。私はOracle 11gとOracle 12cでこれを実行しています。 私は、ソリューションがOracle用に機能する限り、どのようなアプローチ(PL/SQLとは限らない)も柔軟に使用できます。

このコードスニペットを実行するために必要な変更を提案できますか?代わりに、PL/SQLループのサブクエリと

+0

So: 'box_table'と 'shipping_info'という2つのテーブルがありますか?あるテーブルでは 'box_id'がユニーク(多分プライマリキー)で、他のテーブルでは外部キーでしょうか? "更新された"ラベルとは何ですか? 'shipping_info'テーブルで見つかるラベル(その' box_id'のためのラベル)だけですか?これは、あなたが行ったのと同じように、コードに加えてあなたの投稿に提供すべきすべての情報です。 – mathguy

答えて

1

使用平野SQL:この1に

AND trunc(boxed_date) = trunc(SYSDATE - 100) 

select box_lable, count(*) 
from my.shipping_info si 
where box_id IN (
     SELECT box_id 
     FROM my.box_table 
     WHERE box_lable = '600' 
     AND trunc(boxed_date) = trunc(SYSDATE - 100) 
) 
    and box_lable in ('51', '50') 
group by box_lable 

はまた、この状態を書き換える考える

AND boxed_date >= trunc(SYSDATE - 100) 
AND boxed_date < trunc(SYSDATE - 99) 

これは冗長に見えるかもしれませんが、より良い実行計画を選択するのに最適です。特に、boxed_dateのインデックスを使用することができます(関数trunc(boxed_date)はオプティマイザがそのインデックスを使用できないようにします)。

+0

ありがとうございます!私はあなたの問題文を簡略化したと思う..私はこれがうまくいくと思います – underwood

関連する問題