1

私は SQL の初心者で、特に TSQL の初心者です。いくつかの基準に一致するすべてのレコードを読み取り、関連するカテゴリ、成分、単位などのさまざまな結果セットを読み取る SQL Server 2008 の SP を作成する必要があります。1つの要素を読み取る場合、私のSPは次のとおりです。

-- Select the recipe 
SELECT Recipe.*
FROM Recipe
WHERE Recipe.RecipeId = @RecipeId

-- Select the categories themselves
SELECT Category.*
FROM Category
JOIN RecipeCategory ON RecipeCategory.CategoryId = Category.CategoryId
WHERE RecipeCategory.RecipeId = @RecipeId

-- Select the ingredient information for the recipe
SELECT RecipeIngredient.*
FROM RecipeIngredient
JOIN Recipe ON Recipe.RecipeId = RecipeIngredient.RecipeId
WHERE Recipe.RecipeId = @RecipeId

-- Select the ingredients themselves
SELECT Ingredient.* 
FROM Ingredient 
JOIN RecipeIngredient ON RecipeIngredient.IngredientId = Ingredient.IngredientId
JOIN Recipe ON Recipe.RecipeId = RecipeIngredient.RecipeId
WHERE Recipe.RecipeId = @RecipeId  

-- Select the units that are associated with the ingredients    
SELECT Unit.*
FROM Unit
JOIN Ingredient ON Ingredient.UnitId = Unit.UnitId
JOIN RecipeIngredient ON RecipeIngredient.IngredientId = Ingredient.IngredientId
WHERE RecipeIngredient.RecipeId = @RecipeId

持っているすべてのレシピを読み取るように変換するにはどうすればよいですかName like '%..%'

テーブルには何百万ものレシピがあるので、できるだけ効率的にしたいと思います。

4

1 に答える 1

1

名前(ワイルドカードを使用)でレシピを選択するには、次のようにprocを変更します。

-- Get a list of name-matched RecipeIDs
DECLARE @RecipeIDs TABLE (
    RecipeID int not null primary key
)
INSERT INTO @RecipeIDs (RecipeID)
SELECT Recipe.RecipeID
FROM Recipe
-- Change the parameter of the proc from @RecipeId to @Name
WHERE Recipe.Name like '%' + @Name + '%'

-- Select the recipes 
SELECT Recipe.*
FROM Recipe
WHERE Recipe.RecipeId in (select RecipeID from @RecipeIDs)

-- Select the categories themselves
SELECT Category.*
FROM Category
    JOIN RecipeCategory ON RecipeCategory.CategoryId = Category.CategoryId
WHERE RecipeCategory.RecipeId in (select RecipeID from @RecipeIDs)

-- Select the ingredient information for the recipes
SELECT RecipeIngredient.*
FROM RecipeIngredient
    JOIN Recipe ON Recipe.RecipeId = RecipeIngredient.RecipeId
WHERE Recipe.RecipeId in (select RecipeID from @RecipeIDs)

-- Select the ingredients themselves
SELECT Ingredient.* 
FROM Ingredient 
    JOIN RecipeIngredient ON RecipeIngredient.IngredientId = Ingredient.IngredientId
    JOIN Recipe ON Recipe.RecipeId = RecipeIngredient.RecipeId
WHERE Recipe.RecipeId in (select RecipeID from @RecipeIDs)  

-- Select the units that are associated with the ingredients    
SELECT Unit.*
FROM Unit
    JOIN Ingredient ON Ingredient.UnitId = Unit.UnitId
    JOIN RecipeIngredient ON RecipeIngredient.IngredientId = Ingredient.IngredientId
WHERE RecipeIngredient.RecipeId in (select RecipeID from @RecipeIDs)

最初に、新しい@Nameパラメーターに一致するすべてのレシピIDを取得し、次にINの代わりにを使用して結果セットを取得します=

パフォーマンスに関しては、速度を最適化する前に、まず正しい結果が得られていることを確認してください。ただし、パフォーマンスに問題がある場合は、クエリを作成する他の方法がいくつかあります。たとえば、一致するIDのリストが膨大になった場合は、テーブル変数の代わりに一時テーブルを使用してリストを保持するか、名前一致部分をすべての選択に個別にインライン化することができます。たぶん、RecipeIDへの参加は。よりも速いでしょうIN。もちろん、SQLエンジンは、これらすべての場合でほとんど同じことを行う可能性があります(SQLは、結局のところ、本質的に宣言型です)。テーブルのインデックス作成も機能する可能性があります。これがどのように機能するかをお知らせください。

于 2012-07-24T20:21:00.393 に答える