【发布时间】:2014-09-05 18:45:23
【问题描述】:
当我在 SQL Server 上运行此查询以创建索引视图时,删除子查询和联合出现错误
CREATE VIEW [dbo].[view_ToolGroup]
WITH SCHEMABINDING
AS
SELECT
toolGroup.ToolGroupId,toolGroupToTool.ToolId, toolGroupApp.AppId as TGAppId,
purposeToToolGroup.PurposeId as TGPurposeId, TGRole.RoleId as TGRoleId
FROM
[dbo].[toolGroup], [dbo].[purposeToTG], [dbo].[toolGroupToTool],
[dbo].[toolGroupToeApp] as toolGroupApp,
[dbo].[toolGroupToeAppToeRole] as toolGroupAppRole,
[dbo].[eRole] as TGRole
WHERE
toolGroup.ToolGroupId = purposeToToolGroup.ToolGroupId
and toolGroup.ToolGroupId = toolGroupToTool.ToolGroupId
and toolGroup.ToolGroupId = toolGroupApp.ToolGroupId
and toolGroupApp.toolGroupToeApplicationID=toolGroupAppRole.toolGroupToeApplicationID
and toolGroupAppRole.ToolgroupToeApplicationID in
(select ToolgroupToeApplicationID
from [dbo].[ToolgroupToeApplication])
and toolGroupAppRole.RoleId = TGRole.RoleId
UNION
SELECT
toolGroup.ToolGroupId, toolGroup.ToolGroupName,
null, null, null, null, null, null, null, null
FROM
[dbo].[toolGroup], [dbo].[toolGroupToeApplication]
WHERE
toolGroup.ToolGroupId = toolGroupToeApplication.ToolGroupId
and toolGroup.ToolGroupId not in
(select PurposeToToolGroup.ToolGroupId from [dbo].[PurposeToToolGroup])
and toolGroup.ToolGroupId in (select distinct ToolGroupId
from [dbo]. [toolGroupToeApplication] )'
GO
CREATE UNIQUE CLUSTERED INDEX IDX_view_ToolGroup
ON view_ToolGroup(ToolGroupId, ToolId, TGPurposeId, TGRoleId)
GO
有人可以提出替代解决方案来替换 UNION 和子查询吗?
【问题讨论】:
-
没有别无选择 - 如果您想创建索引视图,您必须删除
UNION和子查询。索引视图的要求非常苛刻——这是真的;要么你能做到——要么你不能创建索引视图。 -
Bad habits to kick : using old-style JOINs - 由于 ANSI-92 SQL 标准(多于 20 年前),不应使用
-
我使用了旧式逗号分隔的表列表....但它会导致 ToolGroupId、ToolId、TGPurposeId、TGRoleId 字段上的重复数据,并且它不允许在查询中使用 DISTINCT
-
如果您的查询是合理的(由于我不知道这些表代表什么,我现在不会尝试判断)并且它包含
UNION,那么很有可能您的查询的任何替代形式也将包括UNION或其他一些在索引视图中也不允许的构造。允许的规则不是任意的——它们是为了确保服务器可以根据对基表的更新生成健全的代码来维护视图,而无需重新扫描整个表。 -
正如@Damien_The_Unbeliever 所说,在索引视图中不允许使用这些构造是有原因的。如果您无法让此查询以任何其他方式执行,那么您最好的选择可能是将其物理化。