2014-02-21 136 views
1

給出一個觀點列忽略創建唯一索引

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抱怨重複鍵,但錯誤消息只考慮5指定了6列:

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列,該錯誤消息將是正確的。爲什麼第六列不考慮唯一性?

+0

您只有4行從您的視圖返回? –

+0

@RickS:不,這些是與這場衝突有關的。視圖中總共有幾十萬行。 –

回答

1

如果您可以添加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 
+0

我確實運行了該查詢。這就是我得到問題中顯示的數據的方式。它是針對涉及的表格運行的,而不是視圖。 –

+0

所以查詢Rick S建議返回一些記錄?如果是這樣,那麼你肯定有重複的記錄,對嗎? – Ash8087

+0

我不是很清楚OP是否100%確定沒有基於6列的重複。我知道錯誤消息只包含5個,但您永遠不知道Microsoft錯誤消息以及它們的真正含義。 –