错误:无法在视图“dbo.DataEx”上创建索引。该视图包含“dbo.Classifier”上的自联接

时间:2014-02-21 08:48:28

标签: sql-server sql-server-2012

什么是“自我加入”正确和完整的定义?据我所知,自我加入就像...FROM Role r1 INNER JOIN Role r2 ON r1.ID = r2.ParenteRoleId

但是在这段代码中“自联接”的位置: http://sqlfiddle.com/#!6/e7d058/1

CREATE TABLE dbo.Classifier
(
    ID int IDENTITY(1,1) NOT NULL,
    Name nvarchar(128) NOT NULL
)
GO
CREATE TABLE dbo.Data
(
    ID int IDENTITY(1,1) NOT NULL,
    ClassifierID1 int  NOT NULL,
    ClassifierID2 int  NOT NULL
)

GO
CREATE VIEW dbo.DataEx WITH SCHEMABINDING AS 
SELECT d.ID, c1.Name as ClassifierName1, c2.Name as ClassifierName2
FROM dbo.Data d
    INNER JOIN dbo.Classifier c1 ON d.ClassifierID1=c1.ID
    INNER JOIN dbo.Classifier c2 ON d.ClassifierID2=c2.ID

GO 


SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET NUMERIC_ROUNDABORT OFF

CREATE UNIQUE CLUSTERED INDEX [dbo$DataEx$PK] ON dbo.DataEx 
(
    [ID]
)

GO

此代码抛出错误:

Cannot create index on view "testdb.dbo.DataEx". The view contains a self join on "testdb.dbo.Classifier".

我也尝试使用FROM dbo.Data d, dbo.Classifier c1, dbo.Classifier c2 WHERE d.ClassifierID1=c1.ID AND d.ClassifierID2=c2.ID来避免此错误,但这没有用。

据我所知,我不能在索引视图中两次使用同一个表,我也无法做任何事情,但至少我可以学习一些术语..

2 个答案:

答案 0 :(得分:1)

自连接只是一个连接,它产生的结果集多次包含同一个表。

用于引入表的每个实例的特定连接条件是否提及同一个表的其他实例并不重要。


(对于元问题,坏消息是,如果你现在遇到这个问题,那么你的观点的查询不太可能重新制定,以便它可以编入索引)

答案 1 :(得分:0)

查看msdn文档“创建索引视图”click here

这里指定了

视图定义中的SELECT语句不得包含Transact-SQL元素,如Self-joins等