根据时间范围更新作为另一个表的子集的表

时间:2015-07-27 18:25:09

标签: sql-server

这是我关于堆栈溢出的第一篇文章,也是我第一次找不到答案。我正在使用SQL Server 2008 R2。我从一个我只有读取权限的数据仓库中获取数据。然后,我使用原始表中的数据子集创建自己的表。具体来说,我正在寻找在过去x小时内滚动发生的火警。我通过使用SQL Server代理作业删除和创建表来完成此操作,这可能是正确的,但它可以正常工作。我真的想知道这方面的最佳实践。我在这里看了Update,Merge和许多其他类似的方法,但没有一个基于我需要的时间框架。我无法想出插入不存在的新行的好方法,并删除超过x小时的行。我们每隔2分钟从该表生成一个文本文件,该文件被加载到第三方报告系统中。然后,单位可以选择他们的呼叫并将此表中的所有数据加载到其表单中。我们希望他们只需要查看20小时的通话,但这可能需要增加或减少。我不确定如果文本文件创建者在删除它的确切时刻和重新创建之前会发生什么。

这是我当前的SQL:

DROP TABLE CAD.dbo.EMEDS_FCARSCALLUNIT

SELECT 
    FCARSCallUnit.CALLKEY, FCARSCallUnit.UNITKEY, 
    FCARSCallUnit.UNIT_ID, FCARSCallUnit.CALL_NO, 
    FCARSCallUnit.UNIT_DISPATCH_DATE,
    FCARSCallUnit.UNIT_DISPATCH_TIME, FCARSCallUnit.UNIT_ENROUTE_DATE, 
    FCARSCallUnit.UNIT_ENROUTE_TIME, FCARSCallUnit.UNIT_ONSCENE_DATE, 
    FCARSCallUnit.UNIT_ONSCENE_TIME, FCARSCallUnit.UNIT_ATPATIENT_DATE, 
    FCARSCallUnit.UNIT_ATPATIENT_TIME, FCARSCallUnit.UNIT_BEG_TRAN_DATE, 
    FCARSCallUnit.UNIT_BEG_TRAN_TIME, FCARSCallUnit.UNIT_END_TRAN_DATE, 
    FCARSCallUnit.UNIT_END_TRAN_TIME, 
    FCARSCallUnit.UNIT_BEG_LAST_TRAN_DATE, 
    FCARSCallUnit.UNIT_BEG_LAST_TRAN_TIME, 
    FCARSCallUnit.UNIT_END_LAST_TRAN_DATE, 
    FCARSCallUnit.UNIT_END_LAST_TRAN_TIME, FCARSCallUnit.UNIT_TRANS_COUNT, 
    FCARSCallUnit.UNIT_PREEMPT_DATE, FCARSCallUnit.UNIT_PREEMPT_TIME, 
    FCARSCallUnit.UNIT_CLEAR_DATE, FCARSCallUnit.UNIT_CLEAR_TIME, 
    FCARSCallUnit.UNIT_HOSPITAL_DATE, FCARSCallUnit.UNIT_HOSPITAL_TIME, 
    FCARSCallUnit.UNIT_AT_PATIENT_DATE, FCARSCallUnit.UNIT_AT_PATIENT_TIME
INTO 
    CAD.dbo.EMEDS_FCARSCALLUNIT
FROM 
    [DWLIVE].[dbo].[FCarsCallUnit]
WHERE   
    [UNIT_DISPATCH_DATE] >= CAST(dateadd (hh, -20, getdate()) AS datetime)

1 个答案:

答案 0 :(得分:0)

欢迎使用Stack Overflow。回答什么是最佳做法'不知道你的实际要求是不可能的。如果您想从时间范围收集数据,您的查询就可以了。也许你想要附加到你的桌子上,而不是一直放下它。如果你继续丢弃你的表,你也会删除你应该被替换的索引等(如果你使用索引,你会想要在更大的表上)。
我建议使用INSERT INTO .. VALUES...结构。

https://technet.microsoft.com/en-us/library/dd776381%28v=sql.105%29.aspx

链接中举例说明的格式,我将用于此:

INSERT INTO YourTable (LocationID, CostRate, ModifiedDate)
    SELECT LocationID, CostRate, GETDATE() FROM Production.Location
    WHERE CostRate > 0;

从只有几列开始,直到你开始工作,然后添加你需要的所有列

正如评论中所提到的,您可以使用TRUNCATE清空表...这将保留您的索引......