ストアド プロシージャで SQL Server をループしようとするのがいかに悪いかについての投稿がいくつかあることを知っています。しかし、私は自分がやろうとしていることを完全には見つけていません。内部で直接 Excel にリンクできるデータ接続を使用しています。
ほとんどのループを標準のクエリに変換できると言っている投稿を見たことがあります。しかし、私の人生では、これに問題があります。
custID
タイプ 38,40 のイベントの直前に注文があるすべての s が必要です。ただし、イベントと最初のクエリの順序の間に他の順序がない場合にのみ取得してください。
したがって、3 つの部分があります。最初に、時間枠に基づいてすべての注文 (orders テーブル) を一時テーブルにクエリします。
Select into temp1 odate, custId from orders where odate>'5/1/12'
次に、一時テーブルを使用してセカンダリ テーブルの内部結合を行い、現在の注文の前に過去に発生した可能性のある顧客イベント (LogEvent テーブル) を取得できます。
Select into temp2 eventdate, temp1.custID from LogEvent inner join temp1 on
temp1.custID=LogEvent.custID where EventType in (38,40) and temp1.odate>eventdate
order by eventdate desc
ここでの問題は、実行しようとしているクエリが、各顧客の最新情報のみが必要な最初のクエリから、各顧客のすべての行を返すことです。したがって、これはクライアント側で、すべての古いものではなく 1 つのイベントのみを取得するためにループする場所です。しかし、すべてのクエリを Excel 内で実行する必要があるため、クライアント側を実際にループすることはできません。
3 番目のステップでは、2 番目のクエリの結果を使用して、最新の注文と以前の注文の間でイベントが発生したかどうかを確認できます。イベントが注文に先行し、その間に他の注文がないデータのみが必要です。
Select ordernum, shopcart.custID from shopcart right outer join temp2 on
shopcart.custID=temp2.custID where shopcart.odate >= temp2.eventdate and
ordernum is null
これを簡素化し、クライアントで実行するある種のループの代わりに、SQL Server で実行するようにセットベースにする方法はありますか?