2011-10-28 12 views
1

私は基本的にprocを作成するいくつかのSQLコマンドを持っていますが、これを実行している間にもう少し最適化したいと思います。SQLストアドプロシージャをまとめる

それの最初の部分はこれです:このクエリ

select tr_reference_nbr 
from cfo_daily_trans_hist 
inner join cfo_fas157_valuation on fv_dh_daily_trans_hist_id = dh_daily_trans_hist_id 
inner join cfo_tran_quote on tq_tran_quote_id = dh_tq_tran_quote_id 
inner join cfo_transaction on tq_tr_transaction_id = tr_transaction_id 
inner join cfo_fas157_project_valuation ON fpv_fas157_project_valuation_id = fv_fpv_fas157_project_valuation_id AND fpv_status_bit = 1 
group by tr_reference_nbr, fv_dh_daily_trans_hist_id 
having count(*)>1 

を削除する必要が我々のシステムで重複データを持っているtr_reference_nbrさんが存在私に戻ります。これが実行された後、私は上記のクエリがくれた時にtr_reference_nbr 1で、この他のクエリー、コピーと貼り付けを実行します。

select 
tr_reference_nbr , dh_daily_trans_hist_id ,cfo_fas157_project_valuation.*, 
cfo_daily_trans_hist.* , 
cfo_fas157_valuation.* 
from cfo_daily_trans_hist 
inner join cfo_fas157_valuation on fv_dh_daily_trans_hist_id = dh_daily_trans_hist_id 
inner join cfo_tran_quote on tq_tran_quote_id = dh_tq_tran_quote_id 
inner join cfo_transaction on tq_tr_transaction_id = tr_transaction_id 
iNNER JOIN cfo_fas157_project_valuation ON fpv_fas157_project_valuation_id = fv_fpv_fas157_project_valuation_id 
where 
tr_reference_nbr in 
(
[PASTEDREFERENCENUMBER] 
) 
and fpv_status_bit = 1 
order by dh_val_time_stamp desc 

は今、このクエリは私にその特定の tr_reference_nbrのレコードの束を提供します。私はこのデータを見て、一致する(重複した) dh_daily_trans_hist_idの行を見つけなければなりません。これが見つかると、次の列もその行に一致するように見えて、真の重複であることがわかります。 fpv_unadjusted_sponsor_chargefpv_adjusted_sponsor_charge、、および fpv_adjusted_counterparty_chargeです。

これらの値がすべて一致する場合は、もう1つの列fv_create_dtを調べて、2つのタイムスタンプの間にわずかな差があることを確認してください。あれば、私はこのようになります。これは、前に保存した行にはまだ別のクエリを実行します。

あなたが見ることができるように
begin tran 
update cfo_fas157_valuation set fpv_status_bit = 0 where fpv_fas157_project_valuation_id = [IDRECIEVEDFROMTHEOTHERTABLE] 
commit 

が、これはまだ我々が書かれたいくつかのクエリを持っているにもかかわらず、非常に手動プロセスでありますしかし、私は1つのクエリを実行できる場所への解決策を見つけようとしており、最終的なクエリを除いて基本的にはすべてを実行します。だから基本的に何かを私たちに提供するだろうfpv_fas157_project_valuation_idの更新する必要があります。

これらのクエリを見ると、これをすべて組み合わせる簡単な方法がありますか?私は一日中それに取り組んできたし、何かを実行するように見えることはできません。私はジョイントやものを台無しにし続けているように感じる。

ありがとうございます!

答えて

2

あなたはさまざまな方法でこれらのクエリを組み合わせることができます。

  • クエリの結果を格納するために使用temporary tables - 適したストアドプロシージャの
  • クエリの結果を格納するために使用table variables - ストアドプロシージャ
  • 使用するのに適してしCommon Table Expressions (CTEs)はクエリの結果を格納する - 単一クエリに適しています

あなたはそれらをsepa料金表/変数/ CTE簡単に参加できます。

次に、もう1つのことを実行する必要があります。これは、2つの連続する行のdatetimeの違いを見つけることです。これを行うにはトリックがあります:fv_create_dt

  • が注文したフィールドグループ化することによって仕切られた行数と列を追加するには

    1. 使用ROW_NUMBER()(tr_reference_nbrは、...)の自己を行う= A.ROW_NUMBERに参加B.ROW_NUMBER + 1
    2. A.fv_create_dtとB.の違いを確認してください。fv_create_dtを使用して、1分未満の行をフィルタリングします。

    フィルタリングする必要がある行だけをフィルタリングするために自己結合をテストします。

    これでも問題が解決しない場合は、お気軽にコメントを残してください。

    興味深いことに:SQL Server Denaliには、自己結合なしで次の行と前の行にアクセスするためのT-SQLの拡張機能があります(LEADLAG)。

  • 関連する問題