如何从多个视图创建摘要视图?

Posted

技术标签:

【中文标题】如何从多个视图创建摘要视图?【英文标题】:How to create a summary view from multiple views? 【发布时间】:2010-01-20 22:42:54 【问题描述】:

鉴于我有以下观点,其中 N=1..100

detail_view_N

Pant  Quantity Fieldx ...
A     20          
A     13
B     4

目前我们有汇总视图,可以插入到类似的表格中

summary_view_N

Report_Name     Plant  Count
summary_view_1  A      2
summary_view_1  B      1

然后使用该表创建一个总体摘要,例如

summary_view_all_plants

Report_Name     Plant   Count
summary_view_1  A       2
summary_view_1  B       1
...
summary_view_N  X       Y

有没有一种方法可以创建 summary_view_all_plants 而不必创建每个单独的 summary_view_N?我希望能够遍历报告列表并动态生成插入视图。

【问题讨论】:

【参考方案1】:

有没有一种方法可以创建 summary_view_all_plants 而无需创建每个单独的 summary_view_N?

不 - 您必须定义视图使用的所有表和/或视图。

分层视图并不是一种理想的做法。创始观点可以改变,打破相关的孩子。查询本身存在未针对性能进行优化的风险。

将值插入临时表意味着您必须删除现有记录或使用逻辑来相应地添加或更新。这也意味着必须定期执行此操作以保持同步。索引视图(又名物化视图)可能是一种潜在的解决方案。

【讨论】:

每次通过一组存储过程运行 summary_view_all_plants 时,我们都会从临时表中删除所有行(实际上有一个 ASP 前端,我没有讨论过)。不用说你所说的脆性是正确的,性能不如想法。我继承了这一点,并试图充分利用它。我不知道索引视图,但我的谷歌搜索告诉我它可能不起作用,因为基础数据发生变化并且某些视图具有非确定性列。性能并不是什么大问题,因为它们每天在专用服务器上运行一次。 @noel_g:是的,可悲的是,物化视图是出了名的不适应 为 OMG 小马+1。您必须定义表/视图,一旦完成,您就无法在不重新编译摘要视图的情况下更改任何基础表或视图。【参考方案2】:

我不确定您所说的插入视图是什么意思。

也许您正在寻找这样的查询?

select Plant, count(*) as Count
from MyTable
group by Plant
order by Plant

我假设您的所有摘要视图都在访问同一个表,MyTable。如果不是这种情况,您可能需要一个带有一些动态 SQL 的存储过程来生成您要查找的内容...

【讨论】:

抱歉,如果不清楚。我的意思是,为了创建最终视图 summary_view_all_plants,像 summary_view_N 这样的中间视图插入到一个临时表中。然后 summary_view_all_plants 只是输出该表的内容。 @noel_g:视图插入到临时表中是什么意思。您在这里混淆了术语吗? 请发布您的基础表架构。 创建表 [ttPlantSum] ( [ReportName] [char] (80) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Site] [char] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Count] [numeric](18, 0 ) NULL ) ON [PRIMARY] GO 我的意思是源数据 - 这看起来像是一些汇总表......我有点迷失了你的过程是什么以及你为什么这样做......【参考方案3】:

找到了一个很好的解决方案。我有一个表,其中包含我要总结的视图的名称(detail_view_Names)。我去思考每个报告名称并构建一个查询来执行每个报告的摘要。

DECLARE @REPORT_ID nvarchar(50),
    @sqlCommand varchar(1000)

DECLARE REPORT_cursor CURSOR
    FOR SELECT Report_Name
    FROM detail_view_Names

OPEN REPORT_cursor
FETCH NEXT FROM REPORT_cursor INTO @REPORT_ID

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @sqlCommand = 'SELECT ''' + @Report_ID + ''' AS ReportName, Plant, COUNT(*) AS [Count] FROM dbo.' + @Report_ID + ' GROUP BY Plant'
    EXEC (@sqlCommand)

    FETCH NEXT FROM REPORT_cursor INTO @REPORT_ID

END
CLOSE REPORT_cursor
DEALLOCATE REPORT_cursor

要将新报告添加到摘要中,只需将新报告添加到 detail_view_Names

【讨论】:

以上是关于如何从多个视图创建摘要视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何从多个表的多行创建视图?

如何在一个视图上创建多个视图

如何从 oracle sql 中的一个列结构创建多个列的视图?

如何添加多个视图和删除视图并在删除后从视图中获取所有数据?

phpmyadmin:从多个表创建的视图现在 id 字段不是唯一的,无法编辑,更新删除

创建摘要视图