2011-10-28 87 views
1

所以我有幾個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一個這樣其他查詢,複製和粘貼:

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_charge,fpv_adjusted_sponsor_charge,fpv_unadjusted_counterparty_chargefpv_adjusted_counterparty_charge

如果這些都匹配,我再看看另一列fv_create_dt,並確保兩個時間戳之間的差異小於此值。如果有,我運行已存儲早些時候排又一查詢,它看起來像這樣:

begin tran 
update cfo_fas157_valuation set fpv_status_bit = 0 where fpv_fas157_project_valuation_id = [IDRECIEVEDFROMTHEOTHERTABLE] 
commit 

正如你所看到的,這仍然是即使我們已經寫了幾個疑問非常手工工藝,但我試圖找到一個解決方案,我們可以只運行一個查詢,並且除了最終查詢之外,它基本上會做所有事情。所以基本上我們需要更新一些fpv_fas157_project_valuation_id的東西。

從查看這些查詢,你們中的任何人都可以看到一個簡單的方法來結合所有這些?我一整天都在努力工作,似乎無法運行。我覺得我一直在搞連接和東西。

謝謝!

回答

2

您可以通過多種方式結合這些查詢:

一旦您將它們分開費率表/變量/ CTE您可以輕鬆加入。

然後你必須做更多的事情,那就是在兩個連續的行中找到日期時間的差異。還有一招做到這一點:

  1. 使用ROW_NUMBER()通過fv_create_dt
  2. 與分組字段排序(tr_reference_nbr,...)劃分的行數增加一列做自連接上A.ROW_NUMBER = B.ROW_NUMBER + 1
  3. 檢查A.fv_create_dt和B.之間的差異。fv_create_dt對行與差分濾波器不到一分鐘

還是做你的一個很好的測試自連接,以確保您只過濾行您需要篩選。

如果你仍然有這個問題,請不要猶豫,留下評論。有趣的是:SQL Server Denali具有T-SQL增強功能LEADLAG,用於訪問後續和前一行,而不需要自聯接。