我正在尝试创建视图VW_Checks。我正在使用STUFF合并“平台”和“系统名称”列中的记录,以避免冗长的冗余数据列表。
风景:
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.
如何更改视图/为其添加索引,以便可以正确过滤而不丢失合并记录?
CONTAINS()
是与全文索引一起使用的语句。我想您可以实现该视图,并且要创建一个视图会遇到很多麻烦。相反,您可以使用like
:
WHERE ', ' + (VW_P.Platformname + ', ' like '%, ' + 'iOS' + ', %'
我确实同意Gareth的观点,认为可能还有其他更有效的方式来完成您想要的事情。但是,鉴于此观点,LIKE
比更具意义CONTAINS()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句