2011-11-15 71 views
0

帳戶(表)最佳方式加入兩個表*包括*副本從一個表

+----+----------+----------+-------+ 
| id | account# | supplier | RepID | 
+----+----------+----------+-------+ 
| 1 | 123xyz | Boston |  2 | 
| 2 | 245xyz | Chicago |  2 | 
| 3 | 425xyz | Chicago |  3 | 
+----+----------+----------+-------+ 

支出(表)

+----+----------+----------+-------------+--------+ 
| id | account# | supplier | datecreated | Amount | 
+----+----------+----------+-------------+--------+ 
| 5 | 245xyz | Chicago | 01-15-2009 | 25  | 
| 6 | 123xyz | Boston | 10-15-2011 | 50  | 
| 7 | 123xyz | Boston | 10-15-2011 | -50 | 
| 8 | 123xyz | Boston | 10-15-2011 | 50  | 
| 9 | 425xyz | Chicago | 10-15-2011 | 100 | 
+----+----------+----------+-------------+--------+ 

我有賬表,我有支付表。支付表來自國外,所以我們無法控制它。這給我們帶來了一個問題,即我們無法根據記錄ID字段來加入這兩個表,這是我們無法解決的一個問題。因此我們根據賬號#,供應商ID(第二和第三列)加入。這會產生一個問題,它可能會創建(可能)多對多的關係。但是,如果它們處於活動狀態,我們會過濾我們的記錄,並在創建支出時在支付表上使用第二個過濾器。付款是按月份創建的。有兩個問題在我看來

  1. 查詢需要相當長的時間才能完成(可能是低效)
  2. 有一些重複的是被刪除不應刪除。示例是支付表中的記錄6和8。這裏發生的事情是,我們找到了一位顧客,然後顧客取消了,然後他又找回了顧客。在這種情況下+50,-50和+50。再次,所有值都是有效的,並且必須顯示在報告中以用於審計目的。目前只顯示一個+50,另一個丟失。報告中偶爾會遇到一些其他問題。

這是查詢結果。它使用組來刪除重複項。我希望提前查詢的表現優於其他表,並且考慮到PayOut表中的記錄只要在報告的月份中出現,就不會重複記錄。

這是我們當前的查詢

/* Supplied to Store Procedure */ 
----------------------------------- 
@RepID // the person for whome payout is calculated 
@Month // of payment date 
@year // year of payment date 
----------------------------------- 
select distinct 
A.col1, 
A.col2, 
... 
A.col10, 
B.col2, 
B.Col2, 
B.Amount /* this is the important column, portion of which goes to Rep */ 
from records A 
JOIN payout B 
on A.Supplier = B.Supplier AND A.Account# = B.Account# 
where datepart(mm, B.datecreated) = @Month /* parameter to stored procedure */ 
    and datepart(yyyy, B.datecreated) = @Year 
    and A.[rep ID] = @RepID /* parameter to SP */ 
group by 
col1,col2,col3,....col10 
order by customerName 

這是查詢優化?我可以使用CROSS APPLY或WHERE EXIST來改進它,它可以使它更快並消除重複問題嗎?

請注意,此查詢用於獲取付費代表。因此,每個記錄都有repid字段分配給誰。理想情況下,我想使用Select WHERE Exist查詢。

+0

你可以在選擇中顯示你的實際字段嗎?知道從哪個表獲取哪些字段是相關的。 – JNK

+1

你究竟想要什麼?你說你有'重複'的問題,但似乎想要多行(7和8)。具有當前/期望的結果集將是有幫助的。 –

+0

我有重複刪除的問題。他們被刪除,但他們應該在那裏。恐怕我無法發佈實際的查詢。我的查詢與實際查詢非常相似,除了在實際查詢中使用MAX(col1 case語句)並且我發現這是unnesssary。這導致使用10組通過語句。我想要一個專家意見,如果這是一個健全的查詢如何改進/修復它。 –

回答

0

很難準確理解你想要什麼,因爲在一個地方,你說你想「重複」,但是你說你正在使用該組來刪除重複項。所以首先想到的將是「爲什麼不只是擺脫小組?」。但是我必須相信你足夠聰明才能想到你自己,所以我認爲它必須在那裏出於某種原因。

我覺得有人在這裏可以幫助你很輕鬆地,如果你能後的實際查詢,但既然你說你不能我只是盡力給你解決問題的一些方向......

相反試圖在一個語句中做所有事情,使用臨時表或視圖來分割它。你可能會更容易思考如何擺脫不需要的副本,並保留你先做的副本,然後將它們放到臨時表中,然後將表加入到一起並處理。

+0

以前的程序員使用group by和distinct來移除重複項。我們發現某些副本需要在那裏,正如我在問題中所述。我已經使用CROSS APPLY重寫了查詢。我仍然排除故障並將結果與​​原始結果進行比較。我不認爲這是常見的做法發佈實際查詢或可能是如果我可以改變它的很多東西。如果我不能解決問題,我可能會發布它。我的問題的另一部分是,這個查詢是否正常。性能改進能寫得更好嗎? –

+0

不管聲音是否是一個主觀的問題。我的方法是儘量不要在我的頂級查詢中補償壞數據。這意味着我可能有一個查詢或一個視圖,過濾/轉換數據應該是第一次,然後我查詢該數據。 –

相關問題