4

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

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

以下是我的查询

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 从成分表中获取成分作为连接字符串。 在此处输入图像描述

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

请告诉我

问候曼尼什

4

1 回答 1

1

即使您确实设法删除了子选择,查询的 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

根据您的数据模型,您甚至可能不需要 group by。这个视图可以被索引

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

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

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

于 2014-09-14T11:29:39.217 回答