2013-05-02 85 views
2

我想做一個SELECT將導致數據庫的僞搜索。以下SELECT在VS2010中使用與SQL Server:SQL Server查詢在哪裏與JOIN

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) 

如果沒有使用JOIN和僅使用AsianRecipe表,我可以做一個配方名稱搜索。這三個表使用RecipeID(int)作爲鍵。名字在三個表中不常見。沒有JOIN,使用搜索文本框,下面將給出一個僞搜索是否有用於WHERE:

<SelectParameters> 
    <asp:FormParameter FormField="Name" Name="Name" Type="Int32" /> 
</SelectParameters> 

有沒有辦法寫一個WHERE使用上述查詢,以便在搜索上的名稱進行食譜?

如果只輸入部分名稱,是否有任何方法可以執行搜索?任何幫助將不勝感激!

+3

@AdamWenger:我希望我們可以+1編輯。 – zimdanen 2013-05-02 20:05:21

+2

在最後加入WHERE AsianRecipe.NAME LIKE'%MyName%'?有什麼問題? – zimdanen 2013-05-02 20:06:43

+0

'LIKE'或'PATINDEX'?或者,也許看到:http://stackoverflow.com/questions/194652/sql-server-regular-expressions-in-t-sql – Orbling 2013-05-02 20:06:58

回答

2

我不知道這是不是加入您的派生錶快,但我喜歡它更好的外觀:

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 

可以刪除'%'精確匹配。

請注意,這也將得到沒有評級的食譜。如果這不正確,請將LEFT JOIN更改爲JOIN

另外,如果有人在您的搜索框中放置了多個詞,您可能需要分解多個搜索詞。快速而骯髒的方法是replace(@Name, ' ', '%'),但只能按相同順序查找搜索項。

UPDATE

使用派生表(或CTE)創建聚集在我的箱子的最快方法。接下來將是相關的子查詢,最後是我原來的查詢。非常非正式的測試... YMMV。

因此,我在@RichardTheKiwi upvoting。我的其他觀點依然存在。

+0

正如其他人所提到的,這可能是由於你在參數中使用了Int32而不是字符串。 – 2013-05-02 21:38:02

+0

你無法相信我在這裏感謝大家給我的幫助,特別是你的幫助 - 當場。 – user1830924 2013-05-02 21:39:32

+0

還有一個麻煩就是你不介意。你告訴我的一切都很好,再加上我在搜索中加入了類別。是否對你給我的地方進行了調整,以便拼寫出一個拼寫錯誤的單詞,例如,豌豆會使雪豆豌豆?謝謝 – user1830924 2013-05-07 21:34:16

0

即使您編寫了Int32,我也會假定您的意思是表單輸入字段是字符串。

select * 
from 
(
[Your 'Original' Query] 
) X 
WHERE Name like '%'[email protected]+'%' 

您使用「RecipeID」原始查詢中的兩次,所以你需要調整的是,但在其他方面你都OK。

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 
WHERE AsianRecipe.NAME like '%'[email protected]+'%' -- ADDED A NEW LINE HERE!!! 
) AS AsianRecipe ON (AsianRatingAVG.RecipeID = AsianRecipe.RecipeID) 

!注意!這將不會縮放!

但是,如果你的分貝只有一千個左右的食譜,你會沒事的。

如果您有1000個配方,或者想要能夠處理數百萬個,則必須使用全文搜索。這與調整查詢完全不同。

+0

感謝您的幫助 - 非常感謝。 – user1830924 2013-05-02 21:40:59

2

如果當只有一個派生表時(如果預先聚合)沒有創建兩個派生表,那將會容易得多。

SELECT rep.RecipeID, rep.Category, rep.NAME, rep.[Description], 
     rat.[Count], rat.RatingAVG 
FROM 
(-- pre-aggregated 
    SELECT RecipeID, COUNT(*) AS Count, AVG(Rating) AS RatingAVG 
    FROM AsianRating 
    GROUP BY RecipeID 
) AS rat 
JOIN AsianRecipe rep ON rat.RecipeID = rep.RecipeID; 
-- WHERE rep.name LIKE '%partial%' 
+0

共有3張桌子。兩個可以輸入數據。第三個來自僅在另外兩個表中的一個上進行的查詢。如果我理解你的評論,唯一派生的表是AsianRatingAVG – user1830924 2013-05-02 21:15:46