Sql server SQL Server查询,其中包含JOIN
我想做一个SELECT,它将导致对数据库进行伪搜索。以下选择在VS2010和SQL Server中使用:Sql server SQL Server查询,其中包含JOIN,sql-server,Sql Server,我想做一个SELECT,它将导致对数据库进行伪搜索。以下选择在VS2010和SQL Server中使用: SELECT * FROM ( SELECT RecipeID, COUNT(*) AS Count, AVG(Rating) AS RatingAVG FROM AsianRating GROUP BY RecipeID ) AS AsianRatingAVG INNER JOIN ( SELECT AsianRecipe.RecipeID, AsianRecipe
SELECT *
FROM
(
SELECT RecipeID, COUNT(*) AS Count, AVG(Rating) AS RatingAVG
FROM AsianRating
GROUP BY RecipeID
) AS AsianRatingAVG
INNER JOIN
(
SELECT AsianRecipe.RecipeID, AsianRecipe.Category
, AsianRecipe.NAME, AsianRecipe.Description
FROM AsianRecipe
) AS AsianRecipe ON (AsianRatingAVG.RecipeID = AsianRecipe.RecipeID)
如果没有使用连接,并且只使用了AsianRecipe表,我可以搜索配方名称。这三个表使用RecipeID(int)作为键。这三个表中的名称不常见。如果没有连接,则使用搜索文本框,如果与WHERE一起使用,则以下内容将提供伪搜索:
<SelectParameters>
<asp:FormParameter FormField="Name" Name="Name" Type="Int32" />
</SelectParameters>
是否有任何方法可以使用上面的查询编写一个WHERE,以便对菜谱名称进行搜索
如果只输入了部分名称,是否有方法进行搜索?任何帮助都将不胜感激 即使您编写了Int32,我也认为您的意思是表单输入字段是字符串
select *
from
(
[Your 'Original' Query]
) X
WHERE Name like '%'+@Name+'%'
您在原始查询中使用了“RecipeID”两次,因此需要对其进行调整,否则就可以了
或
!!!注意!!!这将无法很好地扩展
但如果你的数据库只有一千个左右的配方,你就没事了
如果你有1000个食谱,或者想与数百万人一起工作,你必须使用全文搜索。这与调整查询是完全不同的情况。即使您编写了Int32,我假定您的意思是表单输入字段是字符串
select *
from
(
[Your 'Original' Query]
) X
WHERE Name like '%'+@Name+'%'
您在原始查询中使用了“RecipeID”两次,因此需要对其进行调整,否则就可以了
或
!!!注意!!!这将无法很好地扩展
但如果你的数据库只有一千个左右的配方,你就没事了
如果你有1000个食谱,或者想与数百万人一起工作,你必须使用全文搜索。这与调整查询是完全不同的情况。如果不创建两个派生表,而只有一个派生表(用于预聚合),则会容易得多
如果您没有创建两个派生表,而只有一个派生表(用于预聚合),那么这会容易得多
我不确定这是否比加入派生表快,但我更喜欢它的外观:
SELECT re.RecipeID
, re.Category
, re.NAME
, re.Description
, count(ra.RecipeID) AS [Count]
, avg(ra.Rating) AS RatingAVG
FROM AsianRecipe re
LEFT JOIN AsianRating ra ON re.RecipeID = ra.RecipeID
WHERE re.NAME LIKE '%' + @Name + '%' -- Your partial match search
GROUP BY re.RecipeID
, re.Category
, re.NAME
, re.Description
您可以删除“%”
以获得精确匹配
注意,这也会得到没有评级的食谱。如果不正确,请将左连接
更改为连接
此外,如果有人在您的搜索框中输入多个词,您可能需要将多个搜索词分隔开。一种快速而肮脏的方法是replace(@Name,,'%')
,但这只能找到顺序相同的搜索词
更新
使用派生表(或CTE)创建聚合是“我的盒子”上最快的方法。接下来是相关子查询,最后是我的原始查询。非常非正式的测试…YMMV
因此,我投票支持理查德奇维。我的其他观点仍然有效。我不确定这是否比加入派生表更快,但我更喜欢它的外观:
SELECT re.RecipeID
, re.Category
, re.NAME
, re.Description
, count(ra.RecipeID) AS [Count]
, avg(ra.Rating) AS RatingAVG
FROM AsianRecipe re
LEFT JOIN AsianRating ra ON re.RecipeID = ra.RecipeID
WHERE re.NAME LIKE '%' + @Name + '%' -- Your partial match search
GROUP BY re.RecipeID
, re.Category
, re.NAME
, re.Description
您可以删除“%”
以获得精确匹配
注意,这也会得到没有评级的食谱。如果不正确,请将左连接
更改为连接
此外,如果有人在您的搜索框中输入多个词,您可能需要将多个搜索词分隔开。一种快速而肮脏的方法是replace(@Name,,'%')
,但这只能找到顺序相同的搜索词
更新
使用派生表(或CTE)创建聚合是“我的盒子”上最快的方法。接下来是相关子查询,最后是我的原始查询。非常非正式的测试…YMMV
因此,我投票支持理查德奇维。我的其他观点仍然有效。@AdamWenger:我希望我们能+1编辑。在末尾添加像“%MyName%”这样的AsianRecipe.NAME有什么问题?
像或PATINDEX
?或者你可能会看到:那么,你有一张名为“AsianRating”的表格?请解释。@NickVaccaro你可能在开玩笑,但是想到不同的菜肴有不同的表,这有点可怕。@AdamWenger:我希望我们能+1编辑一下。在AsianRecipe.NAME的末尾添加像“%MyName%”
这样的或者PATINDEX
有什么不对?或者你可能会看到:那么,你有一张名为“AsianRating”的桌子?请解释。@NickVaccaro你可能在开玩笑,但想到不同的菜肴有不同的桌子是有点吓人的。总共有3张桌子。两个可以输入数据。第三个是从仅对其他两个表中的一个表进行的查询中派生出来的。如果我理解你的评论,唯一的派生表是AsianRatingAvg。这里总共有3个表。两个可以输入数据。第三个是从仅对其他两个表中的一个表进行的查询中派生出来的。如果我理解您的评论,唯一的派生表是其他人提到的AsianRatingAVGAs,这可能是因为您在参数中使用的是Int32而不是字符串。您无法相信我是多么感谢这里的每个人给我的帮助,尤其是你的帮助-就在现场。另一个麻烦是你不介意。你告诉我的一切都很好,加上我在搜索中扩展了类别。你给我的地方有没有修改过,使拼写错误的单词,例如snaw peas可以变成snowpeas?感谢您使用了您的代码,它在Web项目中非常有效。我开始在一个网站上完成所有的事情,开始使用你的代码,但它在一个网站上不起作用——它一直说我必须为Name声明一个标量值。我什么都试过了。你能给我一个我需要做什么的提示吗?你可能想把它放到一个新的问题中,并给出确切的代码和错误。这可能与“@Name”有关,并在SQL查询中发送一个名为该参数的参数。正如其他人提到的,这可能是因为您在参数中使用的是Int32而不是字符串。您无法相信