2014-12-03 63 views
0

我正在尝试创建视图VW_Checks。我正在使用STUFF合并列'Platforme'和'Systemname'中的记录以避免冗余数据的冗长列表。筛选使用子查询的视图

的观点:

CREATE VIEW [dbo].[VW_Checks] WITH SCHEMABINDING AS 
SELECT DISTINCT C.CheckID AS CheckID, C.CheckTitle as CheckTitle, 
STUFF((SELECT ', ' + PLATFORMNAME 
     FROM dbo.CHECK_PLATFORM CPP 
     WHERE CPP.CHECKID = C.CHECKID 
     for xml path('')),1,1,'') AS Platformname, 
STUFF((SELECT ', ' + SYSTEMNAME 
     FROM dbo.CHECK_SYSTEM CSS 
     WHERE CSS.CHECKID = C.CHECKID 
     for xml path('')),1,1,'') AS Systemname 
FROM dbo.[CHECK] C INNER JOIN    
      dbo.CHECK_CATEGORY CC ON C.CHECKID = CC.CHECKID 
      INNER JOIN dbo.CATEGORY CAT ON CC.CATEGORYID = CAT.CATEGORYID 
      INNER JOIN dbo.CHECK_SYSTEME CS ON CS.CHECKID = C.CHECKID 
      INNER JOIN dbo.CHECK_PLATFORM CP ON CP.CHECKID = C.CHECKID 

的观点是好的,因为它是(意思是它正好说明了我想让它显示的),但是当我试图筛选我的看法,这是行不通的。我的问题

例如:

SELECT * 
FROM VW_Checks VW_C 
WHERE CONTAINS(VW_P.Platformname,'iOS') 

在SELECT语句的WHERE子句上面并没有在所有的工作,仿佛它甚至不存在。 由于VW_P.Platformname是组合列(使用子查询),因此我无法在我的视图上创建唯一索引。

当我尝试创建唯一索引错误消息: Error: 10127, Severity: 16, Cannot create unique index I_VW_Checks on view VW_Checks because it contains one or more subqueries. Consider changing the view to use only joins instead of subqueries. Alternatively, consider not indexing this view.

我怎样才能改变我的看法/添加索引到它,所以我可以正确地过滤,而不会失去我的合并记录?

回答

1

CONTAINS()是全文索引使用的声明。我想你可以实现这个观点并且经历很多麻烦来创造一个观点。相反,你可以使用like

WHERE ', ' + (VW_P.Platformname + ', ' like '%, ' + 'iOS' + ', %' 

我跟加雷同意,可能还有其他更有效的方法做你想做的。但是,鉴于此观点,LIKECONTAINS()更有意义。

0

你不能,但我不明白你为什么想。您将列连接成单个值,然后在一个文本中搜索此单个值。为什么不在连接它们之前搜索列?并且如果需要的话,添加索引到底层的列,例如

SELECT c.* 
FROM vw_Checks AS c 
WHERE EXISTS 
     ( SELECT 1 
      FROM CHECK_PLATFORM AS cpp 
      WHERE cpp.Platformname LIKE '%iOS%' 
      AND  cpp.CheckID = c.CheckID 
     ); 

或者,如果你有一个全文索引:

SELECT c.* 
FROM vw_Checks AS c 
WHERE EXISTS 
     ( SELECT 1 
      FROM CHECK_PLATFORM AS cpp 
      WHERE CONTAINS(cpp.Platformname, 'iOS') 
      AND  cpp.CheckID = c.CheckID 
     );