Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server查询,其中包含JOIN_Sql Server - Fatal编程技术网

Sql server SQL Server查询,其中包含JOIN

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,它将导致对数据库进行伪搜索。以下选择在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.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而不是字符串。您无法相信