筛选使用子查询的视图

时间:2014-12-03 10:43:34

标签: sql sql-server sql-server-2012

我正在尝试创建一个视图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.

如何更改我的视图/添加索引以便我可以正确过滤,而不会丢失我的组合记录?

2 个答案:

答案 0 :(得分:1)

CONTAINS()是与全文索引一起使用的语句。我想你可以实现视图并经历很多麻烦来创建一个。相反,您可以使用like

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

我同意Gareth的观点,可能还有其他更有效的方法来做你想做的事。但是,根据这种观点,LIKECONTAINS()更有意义。

答案 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
        );