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,重复项就会很明显。