2012-09-03 35 views
3

我有兩個表,其都具有一個「名稱」欄中。這些表格不相互關聯。我希望在這兩列中實施唯一性。索引視圖:UNION ALL /全部加入替代

我一直在試圖建立一個索引視圖出了兩列,但已經發現我不能使用UNION ALL,也沒有一個完整的加盟讓名稱的完整列表。我覺得我錯過了一個明顯的選擇,它可以讓我添加獨特的索引。

回答

11

假設兩者的基表對「名稱」唯一約束,那麼唯一的辦法唯一可以侵犯是,如果同一個名字既是表所示。

即你期望加入對他們返回零行。因此,您可以將該連接的結果與具有2行的表交叉連接,並針對該表創建唯一索引。

CREATE TABLE dbo.Two 
    (
    N INT PRIMARY KEY 
) 

INSERT INTO dbo.Two 
VALUES  (1), 
      (2) 

GO 

CREATE VIEW dbo.UniqueNames 
WITH SCHEMABINDING 
AS 
    SELECT T1.Name 
    FROM dbo.T1 
     INNER JOIN dbo.T2 
      ON T1.Name = T2.Name 
     CROSS JOIN dbo.Two 

GO 

CREATE UNIQUE CLUSTERED INDEX IX 
    ON dbo.UniqueNames(Name) 
+0

對於基礎表的任何更改,此方法不會導致聚集索引重建嗎? – Andomar

+0

@Andomar - 重建什麼?視圖應該總是不包含行,除非可能臨時拋出違反約束的行。索引視圖維護應該只嘗試和修改基表中的修改行。這就是爲什麼索引視圖有所有限制。 –

+0

感謝您的澄清。我不知道索引視圖是否那麼聰明。 :) – Andomar