2012-03-19 25 views
3
來檢索表/ log_table歷史數據

我有以下表格:T-SQL通過RelevanceDate

1) TBL (ID, Data, LastUpdated, DateCreated) 
2) TBL_LOG(Log_ID, LogCreateDate, ID, Data, LastUpdated, DateCreated) 

TBL用於存儲當前的數據和用於存儲在TBL數據的每一次變化TBL_LOG(使用更新觸發,從TBL刪除的記錄複製到TBL_LOG)。

現在我需要通過相關日期檢索數據。
我如何編寫表值函數(或其他替代函數),它將根據RelevanceDate返回數據。

我理解的邏輯,但我不能找到它寫在SQL一個好辦法...
的邏輯是這樣的:

@RelevanceDate = '2011-03-01' 
IF TBL.LastUpdated <= @RelevanceDate THEN return data from TBL 
ELSE IF Exists data in TBL_LOG where TBL_LOG.LastUpdated <= @RelevanceDate 
    THEN return most resent data from TBL_LOG where TBL_LOG.LastUpdated <= @RelevanceDate 
ELSE IF Exists data in TBL_LOG where TBL_LOG.LastUpdated > @RelevanceDate 
    THEN return the oldest data from TBL_LOG.LastUpdated > @RelevanceDate 
ELSE return data from TBL 

該函數將返回使用上面的邏輯數據,對於TBL中的所有記錄。

簡而言之,對於TBL中的每一行,我需要關於「RelevanceDate」的數據。

+0

您的兩個'ELSE IF'塊具有相同的條件:'在TBL_LOG中存在數據,其中TBL_LOG.LastUpdated <@RelevanceDat e' – MatBailie 2012-03-19 13:32:07

+0

我更新了表達式,謝謝。 – 2012-03-19 13:38:15

+0

將所有內容存儲在TBL_LOG中,然後您只需查詢TBL_LOG。基本上在TBL的INSERT和UPDATE中將觸發器插入到TBL_LOG中。如果您添加「操作」列,您甚至可以存儲刪除。至於你的查詢,我不知道你在做什麼,可能用英文解釋,而不是在你的代碼片段中,你在做什麼。您可能需要聯合TBL表查詢並查詢TBL_LOG。 – 2012-03-19 13:40:05

回答

1

在我的調查結束後,我結束了類似如下因素:

DECLARE @RelevanceDate DATETIME 
SET @RelevanceDate = '2012-03-01' 

SELECT 
     MainData.ID, MainData.Data, MainData.LastUpdated, MainData.DateCreated 
FROM (
      SELECT 
        * 
        ,ROW_NUMBER() OVER(PARTITION BY AllData.ID, AllData.RowNum ORDER BY AllData.LastUpdated) AS MainRowNumber 
      FROM (
         --Current Data 
         SELECT 
          NULL LogID 
          ,NULL LogCreateDate 
          ,* 
          ,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY LastUpdated DESC) AS RowNum 
         FROM TBL 
         WHERE (lastupdate<[email protected]) 

         UNION 

         --History Data 
         SELECT 
          * 
          ,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY LastUpdated) AS RowNum 
         FROM TBL_LOG 
         WHERE lastupdate>@RelevanceDate 
       ) AllData WHERE AllData.RowNum=1 
     ) MainData 
WHERE MainData.MainRowNumber = 1 

如果有人有一個建議如何能以更好的方式完成,我會很高興看到它:)

0

你可以在你選擇使用嵌套CASE語句,大致沿着這些線路:

SELECT 
    CASE WHEN TBL.LastUpdated <= @RelevanceDate THEN TBL.data ELSE 
     CASE WHEN TBL_LOG.LastUpdated < @RelevanceDate AND NOT TBL_LOG.Data IS NULL THEN 
      TBL_LOG.Data 
     ELSE 
      ... 
     END 
    END AS Data 
FROM TBL TBL 
LEFT JOIN TBL_LOG TBL_LOG 
ON TBL.ID = TBL_LOG.ID 
+0

此方法可行,但我無法使用它,因爲在TBL中的每個字段中維護都非常困難,因此我需要創建嵌套的案例。無論如何謝謝你! – 2012-03-19 16:08:57