0

我有一个数据仓库和一个暂存数据库。staging 每天在 ftp 上获取一个新文件,该文件被加载到 staging DB 上。然后在数据库仓库中插入/更新/删除。但是,暂存文件只有最近 5 天的记录,这些记录是滚动的。也就是说,今天是从 8 月 8 日到 8 月 13 日,但明天该文件将包含从 8/9 到 8/14 的数据,而 DB 仓库具有所有历史记录。

当我使用

WHEN NOT MATCHED BY SOURCE THEN DELETE

它将从 DBwarehouse 中删除与暂存不匹配的所有记录。这将抹去所有的历史。我想控制脚本只返回 5 天并检查它是否与源不匹配。这是查询:

MERGE INTO 
[x].[y].[z] AS Target
USING [a].[y].[z]AS Source
ON target.[PROBLEM_ID] =source.[PROBLEM_ID]

WHEN MATCHED THEN 
UPDATE SET 
Target.[CUSTNO] = Source.[CUSTNO],
Target.[SALESID] = Source.[SALESID],
Target.[PCODE] = Source.[PCODE]

WHEN NOT MATCHED BY TARGET THEN
INSERT    
       ([CUSTNO]
       ,[SALESID]
       ,[PCODE])
VALUES

       (source.[CUSTNO]
       ,source.[SALESID]
       ,source.[PCODE])

WHEN NOT MATCHED BY SOURCE 
THEN DELETE;

;

我可以限制删除语句只返回数据库仓库 5 天吗?如果是,请帮助我提供约束代码。

4

2 回答 2

0

我没有尝试过,但文档说您可以在“WHEN NOT MATCHED BY SOURCE”中添加“AND”子句。这会让你这样做:

WHEN NOT MATCHED BY SOURCE AND Your_Date_Field > DateAdd(Day,-5,GetDate())
THEN DELETE;

请注意,如果您的日期包含时间,您可能需要在比较日期之前截断时间。

于 2013-08-13T20:20:21.920 回答
0

这基本上就是你想要做的。您使用一个公用表表达式来构建一个更复杂的集合来合并。您也可以在匹配时和不匹配时执行“和”,但我发现首先从 cte 中专门构建的数据集开始更简洁。

和平凯瑟琳

with [merge_helper] ([custno], [salesid], [pcode])
 as (select [source].[id],
            [source].[custno],
            [source].[salesid],
            [source].[pcode]
     from   [a].[y].[z] as [source]
     left join   [x].[y].[z] as [target]
       on [target].[id] = [source].[id]
     union
     select [target].[id],
            [target].[custno],
            [target].[salesid],
            [target].[pcode]
     from   [x].[y].[z] as [target]
     where  [target].[id] not in (select [id]
                                  from   [source]))
merge into [x].[y].[z] as target
using [merge_helper] as source
on target.[id] = source.[id]
when matched then
update set target.[custno] = source.[custno],
           target.[salesid] = source.[salesid],
           target.[pcode] = source.[pcode]
when not matched by target then
    insert ([custno],
        [salesid],
        [pcode])
values (source.[custno],
        source.[salesid],
        source.[pcode])
when not matched by source then
delete; 
于 2013-08-13T20:54:37.493 回答