怎么写这么一个视图索引(View Index)?

stevenhzhang 2012-03-23 10:48:04
我有2个table(table1, table2),要把他们联合起来更具求一个和。并且必须把id作为view的索引index(因为我在其他地方还要用到这个view和其他table INNER JOIN)


CREATE View dbo.vw_Final WITH SCHEMABINDING
AS
SELECT id , SUM(Quantity) AS Quantity
FROM ( SELECT id, Quantity FROM Table1
UNION ALL
SELECT id, Quantity FROM Table2) AS T1
GROUP BY id

GO

CREATE UNIQUE CLUSTERED INDEX IDX_vw_Final_id
ON vw_Final(id);

GO


他就会有出错信息

Msg 10109, Level 16, State 1, Line 2
Cannot create index on view "dbo.vw_Final" because it references derived table "T1" (defined by SELECT statement in FROM clause). Consider removing the reference to the derived table or not indexing the view.

我理解就是用UNION产生的table不能index。那我应该怎么办呢?
...全文
779 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2012-03-23
  • 打赏
  • 举报
回复
楼主的情况,只可用分区视图,在表1、表2分别建索引


建索引视图不支持 UNION、EXCEPT 或 INTERSECT 运算符。
唐诗三百首 2012-03-23
  • 打赏
  • 举报
回复
by the way,

the official name of this is 'Indexed View', Not 'View Index'.

唐诗三百首 2012-03-23
  • 打赏
  • 举报
回复
for the same result, you can try below,

CREATE View dbo.vw_Final1 WITH SCHEMABINDING
AS
SELECT id, SUM(Quantity) AS Quantity
FROM Table1
GROUP BY id
GO

CREATE UNIQUE CLUSTERED INDEX IDX_vw_Final1_id
ON vw_Final1(id);
GO


CREATE View dbo.vw_Final2 WITH SCHEMABINDING
AS
SELECT id, SUM(Quantity) AS Quantity
FROM Table2
GROUP BY id
GO

CREATE UNIQUE CLUSTERED INDEX IDX_vw_Final2_id
ON vw_Final2(id);
GO


CREATE View dbo.vw_Final3 WITH SCHEMABINDING
AS
select isnull(a.id,b.id) 'id',
isnull(a.Quantity,0)+isnull(b.Quantity,0) 'Quantity'
from vw_Final1 a full join vw_Final2 b on a.id=b.id
GO

CREATE UNIQUE CLUSTERED INDEX IDX_vw_Final3_id
ON vw_Final3(id);
GO
水族杰纶 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acherat 的回复:]
你要建立的是索引视图,而不是在创建视图之后再在视图上加索引,视图创建后是加不了索引的,和表不同。
[/Quote]
所谓索引视图
就是建立视图之后再创建索引
只是创建该视图时候又很多严格要求
gw6328 2012-03-23
  • 打赏
  • 举报
回复
梁哥火气好大啊 :)
貌似要有什么架构吧。楼主查一查吧。
liangCK 2012-03-23
  • 打赏
  • 举报
回复
提示已经说得很清楚了,

创建索引视图的前提条件是视图内不能函有派生表。
liangCK 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acherat 的回复:]

你要建立的是索引视图,而不是在创建视图之后再在视图上加索引,视图创建后是加不了索引的,和表不同。
[/Quote]

不知道你说的什么毛毛。
AcHerat 2012-03-23
  • 打赏
  • 举报
回复
AcHerat 2012-03-23
  • 打赏
  • 举报
回复
你要建立的是索引视图,而不是在创建视图之后再在视图上加索引,视图创建后是加不了索引的,和表不同。
叶子 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ap0405140 的回复:]

by the way,

the official name of this is 'Indexed View', Not 'View Index'.
[/Quote]
8楼在重新生成后,就出现了。

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧