2

データベースの疑似検索を行う SELECT を実行したいと考えています。次の 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)

JOIN を使用せず、AsianRecipe テーブルのみを使用する場合は、レシピ名を検索できます。3 つのテーブルは、RecipeID (int) をキーとして使用します。名前は 3 つのテーブル間で共通ではありません。JOIN を使用せずに SEARCH テキストボックスを使用すると、次のように WHERE を使用すると疑似検索が行われます。

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

レシピの名前で検索が行われるように、上記のクエリを使用して WHERE を記述する方法はありますか?

名前の一部だけを入力して検索する方法はありますか? どんな助けでも大歓迎です!

4

3 に答える 3

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, ' ', '%')は、同じ順序で検索用語を見つけることだけです。

アップデート

派生テーブル (または CTE) を使用して集計を作成するのが、私のボックスで最速の方法です。次は相関サブクエリで、最後に元のクエリです。非常に非公式なテスト...YMMV.

そういうわけで、私は@RichardTheKiwiに賛成です。私の他のポイントはまだ立っています。

于 2013-05-02T20:17:55.723 に答える
2

2 つの派生テーブルを作成しないと (事前集計の場合) 1 つしか作成できない場合は、はるかに簡単でした。

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%'
于 2013-05-02T20:17:05.883 に答える