从视图中删除子查询以使其成为索引视图

时间:2013-01-21 08:30:36

标签: sql-server views

我想为全文搜索创建索引视图。

我唯一面临子查询的问题,因为索引视图不允许使用子查询。

下面是我的查询

ALTER VIEW [dbo].[Demo] with SCHEMABINDING  AS
select distinct a.ID,a.Title, a.Description ,b.Name as Recipe, c.Name as Taste , d.Name as CuisineType,
STUFF((SELECT ',' + Name FROM dbo.Ingredients where ID in (select IngredientID from dbo.listingIngredients 
where listingid = a.ID ) FOR XML PATH('')), 1, 1, '') as Ingredients
from dbo.Listing as a 
inner join dbo.RecipeType b on a.RecipeTypeID = b.ID
inner join dbo.taste c on a.tasteID = c.ID
inner join dbo.CuisineType d on a.CuisineTypeID = d.ID
inner join dbo.listingIngredients e on a.ID = e.listingID
GO

我使用子查询使用STUFF从Ingredients表中获取成分作为连接字符串。 enter image description here

可以请一些人告诉我如何删除这个子查询并将成分作为满足的字符串。

请让我知道

问候 和Manish

1 个答案:

答案 0 :(得分:0)

查询的XML部分将导致问题,即使您确实设法删除了子选择。

然而,一切都不会丢失。您可以将视图重写为可以编制索引的部分,将另一部分重写为更便宜,但不能。例如,您可以写:

ALTER VIEW [dbo].[Demo_Part] with SCHEMABINDING  AS
select a.ID,a.Title
, a.Description 
, b.Name as Recipe
, c.Name as Taste 
, d.Name as CuisineType
, e.name
from dbo.Listing as a 
inner join dbo.RecipeType b on a.RecipeTypeID = b.ID
inner join dbo.taste c on a.tasteID = c.ID
inner join dbo.CuisineType d on a.CuisineTypeID = d.ID
inner join dbo.listingIngredients e on a.ID = e.listingID
GROUP BY a.ID,a.Title
, a.Description 
, b.Name as Recipe
, c.Name as Taste 
, d.Name as CuisineType
, e.name

根据您的数据模型,您可能甚至不需要分组。此视图可以编入索引

然后编写另一个未编入索引但取代原始视图的视图

CREATE VIEW [dbo].[Demo]
SELECT ...
 STUFF (...)
FROM [dbo].[Demo_Part]

作为一个元回答,我想补充一点,如果你需要索引这样的视图(并使用DISTINCT),很可能你的数据建模者在数据模型上犯了一个很大的错误,或者你的数据访问代码是非常低效。关于这一切的一切都闻起来就像你正试图解决糟糕的编码和建模实践。