我正在尝试创建一个视图VW_Checks。我正在使用STUFF合并列中的记录' Platforme'和'系统名称'避免冗长的冗余数据列表。
观点:
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.
如何更改我的视图/添加索引以便我可以正确过滤,而不会丢失我的组合记录?
答案 0 :(得分:1)
CONTAINS()
是与全文索引一起使用的语句。我想你可以实现视图并经历很多麻烦来创建一个。相反,您可以使用like
:
WHERE ', ' + (VW_P.Platformname + ', ' like '%, ' + 'iOS' + ', %'
我同意Gareth的观点,可能还有其他更有效的方法来做你想做的事。但是,根据这种观点,LIKE
比CONTAINS()
更有意义。
答案 1 :(得分: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
);