Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL通过RelevanceDate从表/log_表中检索历史数据_Sql_Sql Server_Tsql - Fatal编程技术网

T-SQL通过RelevanceDate从表/log_表中检索历史数据

T-SQL通过RelevanceDate从表/log_表中检索历史数据,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下表格: 1) TBL (ID, Data, LastUpdated, DateCreated) 2) TBL_LOG(Log_ID, LogCreateDate, ID, Data, LastUpdated, DateCreated) TBL用于存储当前数据,TBL_日志用于使用更新触发器在TBL中存储数据的每次更改,从TBL中删除的记录复制到TBL_日志 现在我需要按相关日期检索数据。 如何编写表值函数或其他根据RelevanceDate返回数据的替代方法 我理解这个逻辑,但是我找不

我有以下表格:

1) TBL (ID, Data, LastUpdated, DateCreated)
2) TBL_LOG(Log_ID, LogCreateDate, ID, Data, LastUpdated, DateCreated)
TBL用于存储当前数据,TBL_日志用于使用更新触发器在TBL中存储数据的每次更改,从TBL中删除的记录复制到TBL_日志

现在我需要按相关日期检索数据。 如何编写表值函数或其他根据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中的每一行,我需要相关日期上的数据。

您可以在select中使用嵌套的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

在调查结束时,我得出了如下结论:

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<=@RelevanceDate)

                      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

如果有人有更好的建议,我很乐意看到:

你的另外两个If块具有相同的条件:TBL_LOG中存在数据,其中TBL_LOG.LastUpdated<@RelevanceDate我更新了表达式,谢谢。将所有内容存储在TBL_日志中,然后你只需要查询TBL_LOG。基本上,在插入和更新TBL时,将触发器插入TBL_日志。如果添加操作列,甚至可以存储删除。至于你的问题,我不确定你在追求什么,可能用英语解释,而不是在你的代码片段中解释你在追求什么。您可能需要将TBL表查询与TBL_日志查询合并。作为起点,我使用UNION ALL for TBL和TBL_日志来选择单个结果集。现在,我如何选择带有RelevanceDate上的数据的记录?这种方法会起作用,但我不能使用它,因为它将很难在…中维护,对于TBL中的每个字段,我将需要创建嵌套的案例。无论如何,谢谢你!