Sql server 创建唯一索引时忽略列

Sql server 创建唯一索引时忽略列,sql-server,Sql Server,给出一个视图 CREATE VIEW MyView WITH SCHEMABINDING AS SELECT A, B, Year, t1.FKId, C, D, COUNT_BIG(*) as Cnt, SUM(W) As Wgt FROM [dbo].[T1] t1 INNER JOIN [dbo].T2 t2 ON t1.FKId = t2.Id INNER JOIN [dbo].T3 t3 ON t1.FKId = t3.FKId AND t1.FKId = t3.FKId GROU

给出一个视图

CREATE VIEW MyView WITH SCHEMABINDING AS 
SELECT  A, B, Year, t1.FKId, C, D, COUNT_BIG(*) as Cnt, SUM(W) As Wgt
FROM [dbo].[T1] t1
INNER JOIN [dbo].T2 t2 ON t1.FKId = t2.Id
INNER JOIN [dbo].T3 t3 ON t1.FKId = t3.FKId AND t1.FKId = t3.FKId
GROUP BY A, B, Year, t1.FKId, C, D
当我试图使其成为索引视图时

CREATE UNIQUE CLUSTERED INDEX IX_CLU_My
ON MyView (FKId, A, B, Year, C, D)
SQL Server抱怨密钥重复,但错误消息只考虑指定的6列中的5列:

CREATE UNIQUE INDEX语句终止,因为为对象名“dbo.MyView”和索引名“IX_CLU_My”找到了重复的键。重复的键值是(934,1,6,2014,1)

视图中与前4个键对应的实际数据为:

FKId   A  B  Year  C  D
934    1  6  2014  1  5
934    1  6  2014  1  15
934    1  6  2014  2  5
934    1  6  2014  3  5

考虑到前5列,错误消息是正确的。为什么不考虑第6列的唯一性?

如果您可以添加HAVING子句,并且没有记录返回,那么我将帮助您进一步解决此问题

SELECT  A, B, Year, t1.FKId, C, D, COUNT_BIG(*) as Cnt
FROM [dbo].[T1] t1
INNER JOIN [dbo].T2 t2 ON t1.FKId = t2.Id
INNER JOIN [dbo].T3 t3 ON t1.FKId = t3.FKId AND t1.FKId = t3.FKId
GROUP BY A, B, Year, t1.FKId, C, D
HAVING Count(*) > 1

您的视图只返回了4行?@RickS:不,这些是与此冲突相关的行。视图中总共有10万行。我确实运行了该查询。我就是这样得到问题中显示的数据的。它是针对相关的表而不是视图运行的。所以Rick建议的查询返回了一些记录?如果是这样,那么你肯定有重复的记录,对吗?我不太清楚OP是否100%确定基于6列没有重复的记录。我知道错误消息只包括5条,但你永远不知道Microsoft错误消息及其真正含义。@RickS:问题中显示的数据是从视图返回的所有行,选择
,其中FKId=934,A=1,B=6,Year=2014
。如您所见,在
C=1
中存在潜在冲突,但这不是冲突,因为
D
每行的值不同。错误消息表明
D
未用作密钥的一部分。如果您对重复项有问题,只需运行查询,从所有涉及的表中选择所有PK,重复项就会很明显。