Sql server 索引视图:联合所有/完全联接备选方案

Sql server 索引视图:联合所有/完全联接备选方案,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我有两个表,它们都有一个“Name”列。这些表彼此不相关。我想在这两列之间强制执行唯一性 我一直试图用这两列创建一个索引视图,但发现我不能使用union all或full join来获取完整的名称列表。我觉得我缺少了一个明显的替代方案,它允许我添加唯一索引。假设两个基表对“Name”都有唯一的约束,那么唯一可以违反唯一性的方法就是如果两个表中都有相同的名称 i、 e.您期望针对它们的联接返回零行。因此,您可以将该联接的结果交叉联接到一个包含2行的表中,并针对该表创建一个唯一的索引 CREATE

我有两个表,它们都有一个“Name”列。这些表彼此不相关。我想在这两列之间强制执行唯一性


我一直试图用这两列创建一个索引视图,但发现我不能使用union all或full join来获取完整的名称列表。我觉得我缺少了一个明显的替代方案,它允许我添加唯一索引。

假设两个基表对“Name”都有唯一的约束,那么唯一可以违反唯一性的方法就是如果两个表中都有相同的名称

i、 e.您期望针对它们的联接返回零行。因此,您可以将该联接的结果交叉联接到一个包含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) 

这种方法不会导致对基础表的任何更改进行聚集索引重建吗?@Andomar-rebuild of what?视图应始终不包含任何行,除非可能是临时的,如果它即将抛出约束冲突。索引视图维护只应尝试对基表中的修改行执行联接。这就是为什么对索引视图有所有限制的原因。感谢您的澄清。我不知道索引视图有那么聪明。:)