2016-11-13 34 views
0

我有兩個表:SQL關節和組同時

  • R1與主密鑰K1。

  • R 2與輔助密鑰K1(從R1表)重複的授權。

r2因此可以具有多條具有k1作爲次級密鑰的線路,因此可以在其上進行求和。

例子:

r1 = 
(NationalID| Name | Surname | Age) 
(9854512| Smith| Ben  | 27) 
(5454544| Khan | Michel | 29) 
(...................) 

r2 = 
(DrivingPenaltyNumber | NationalID | DrivingPenaltyValue   ) 
(1     |9854512  | 10       ) 
(2     |5454544  | 5       ) 
(3     |9854512  |        ) 
(..................................................................) 

我想加入這兩個表,在包含兩列一個表:主鍵K1 = NationalID,(在R2 K1的出現次數的數量駕車的處罰數量對於每個人),r2中給定變量的總和(每個人的懲罰總和爲$),然後過濾累積懲罰高於邊界的線。所以,我想在不創建中間表的情況下同時進行連接,組合和調節操作。這是否是正確和最佳的解決方案?

select r1.NationalID, count(r2.NationalID) as numberOfPenalties, sum(r2.DrivingPenaltyValue) as totalPenalty 
from r1 
left join r2 
on r1.NationalID= r2.NationalID 
group by r1.NationalID 
having count(r2.DrivingPenaltyValue) > boundary 

此外,是否有可能使用而不是有?如何 ?你能否請幫助,並可能提供參考。

+1

你的查詢很好。你的問題是什麼? –

+0

我想你的意思是'有(r2.DrivingPenaltyValue)> boundary'的總和,而不是'有計數(r2.DrivingPenaltyValue)> boundary' – lovasoa

+0

是的,的確,查詢工作(在最後一行的總和更換計數後)。但是我想知道是否有可能使用哪裏而不是最後一行來做到這一點? –

回答

1

如果我理解你的要求正確,那麼你實際上並不需要r1加入。您可以通過使用GROUP BY,COUNT()HAVING來獲取每個密鑰的出現次數。我只是將一個閾值存儲在一個變量中。你可以做任何你想要的。

SET @threshold = 10; /* you can change this */ 

SELECT k1, COUNT(1) num_occurrences FROM r2 GROUP BY k1 HAVING num_occurrences > 
@threshold; 

你可以LEFT JOINr1爲了找到鑰匙上/下閾值做上面的查詢後。

+0

感謝您的回答。我添加了一個表格的例子來使問題更加清晰。事實上,我需要加入表格,因爲我需要從第一個表格添加一些列。那麼如何在同一個查詢中添加連接(對於上面的示例)? –