从视图中插入或更新表

时间:2013-07-05 13:50:20

标签: sql sql-server-2008-r2 sql-update sql-insert

我认为我可以将一些相关的表格组织成一组更易于管理的统计数据列(例如购买/佣金信息)。

我现在已经在视图中对所有计算进行了排序,但由于有许多计算列和大量数据(近1m记录),因此视图难以表现良好。

作为一个示例,在没有修改的情况下访问视图会返回结果,但只是对从该视图中选择的一列进行计数(*)需要很长时间。

我的想法是获取视图的数据并将其渲染为真实的"基于视图列建模的统计表。

我的问题是,如何将视图中的列直接插入或更新到这个新表中?

如果条目与PK不匹配,我需要能够INSERT进入新表,如果是,则需要UPDATE现有行,因为视图数据可能会因为影响其列值的进程而发生变化,IE:有人取消一个订单,以便退款,然后视图将显示统计数据,因为现在有更多的钱退还,我将需要更新我的存储表。

此外,由于代码复杂性和时间限制,我无法在操作点执行此操作,因此会定期调用。

我希望这是有道理的。

1 个答案:

答案 0 :(得分:1)

根据我的理解,您是最佳选择,考虑到Sql Server 2008将使用Merge Command http://technet.microsoft.com/en-us/library/bb510625.aspx

你可以写下这样的东西:

MERGE INTO Sales.SalesReason AS Target
USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), ('Internet', 'Promotion'))
       AS Source (NewName, NewReasonType)
ON Target.Name = Source.NewName
WHEN MATCHED THEN
    UPDATE SET ReasonType = Source.NewReasonType
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)

顺便说一句,如果您拥有良好的数据库结构和维护,那么100万条记录应该不会成为问题。检查索引,统计信息和直方图,看它们是否仍然有效。还要运行tunning advisor以查看您的索引是否正常。

相关问题