2012-05-03 70 views
1

我有三個表及其相關的欄目有:最佳方式多到很多連接

tPerson 
-> PersonID 

tPersonStatusHistory 
-> PersonStatusHistoryID 
-> PersonID 
-> StatusID 
-> PersonStatusDate 

Status 
-> StatusID 

我想存儲的所有狀態的完整歷史,一個人過。但我也想輕鬆訪問當前狀態。

查詢來獲取當前狀態:

SELECT TOP 1 StatusID FROM tPersonStatusHistory 
WHERE PersonID = ? ORDER BY PersonStatusDate DESC 

我要的是一個查詢,將獲取我的個人記錄列表,以及他們最近StatusID,查詢中的一列。

我們曾嘗試以下方法:

  1. 包括上述查詢中選擇一個子查詢。
  2. 將CurrentPersonStatusHistoryID列添加到tPerson表並使用調用用戶定義函數的計算列對其進行維護。
  3. 使用tPersonStatusHistory表上的觸發器維護CurrentPersonStatusHistoryID列。

拉起Person記錄的查詢功能相當高,所以我不想每次都查找歷史記錄表。觸發器方法與我想要的最接近,因爲數據在Person表中保存,並且只有在進行更新時纔會更改(這不是經常進行比較)。

我覺得觸發很難維護,我寧願遠離它們。我還發現,在執行插入選擇或涉及多個記錄的更新查詢時,觸發器僅在第一個記錄上調用,而不在其他記錄中調用。

我真正想要的是將一些邏輯放入CurrentPersonStatusHistoryID的列定義中,按下Save並讓它在後臺保留並更新,而無需我的干預。

鑑於多對多的關係很常見,我想知道是否有其他人遇到類似的情況,並對最高性能,最好是最簡單的實現方式有所瞭解。

回答

1

另一種方法是使用類似下面的查詢,也許作爲視圖。它會爲您提供每個人的最新狀態ID。

SELECT PersonID, StatusID 
FROM (
    SELECT PersonID, StatusID, 
     rank() OVER(PARTITION BY PersonID ORDER BY PersonStatusDate DESC) as rnk 
    FROM tPersonStatusHistory 
) A 
WHERE rnk = 1 

我不確定這是否滿足您對性能的要求,但它是您可以查看的內容。

+0

我從來沒有見過這樣的人,謝謝;它肯定比其他方法更清潔。我會把它變成一個視圖,並加入它而不是表格,並看看我如何去。 –