2014-12-03 83 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 
     );