Для начала, некоторая справочная информация. Я создаю простую базу данных рецептов, и я пытаюсь создать запрос, который покажет мне, что я могу сделать, основываясь на элементах в моей кладовой. Схемы таблиц являются следующими:SQL multi-table составной ключ уникальный запрос
RECIPE(*RecipeID*, RecipeName)
RECIPE_INGREDIENT(***RecipeID***, **IngredientID**)
INGREDIENT(*IngredientID*, IngredientName)
PANTRY_ITEM(*ItemID*, ItemName)
Поля в таблице RECIPE_INGREDIENT составляет составной ключ и оба внешних ключей в рецепт (RecipeID) и таблицу ингредиента (IngredientID). Я использую следующие тестовые данные:
RECIPE table
RecipeID,RecipeName
1,'food 1'
2,'food 2'
INGREDIENT Table
IngredientID, IngredientName
1,'ing 1'
2,'ing 2'
3,'ing 3'
RECIPE_INGREDIENT table
RecipeID,IngredientID
1,1
1,2
2,2
2,3
PANTRY_ITEM table
ItemID,ItemName
1,'ing 2'
2,'ing 3'
Поэтому в основном я пытаюсь запросить список RecipeNames на основе элементов есть в моей кладовой. Под этим я подразумеваю, что у меня должны быть все ингредиенты для рецепта в моей кладовой, чтобы он был добавлен в список. Поэтому идеальный запрос, основанный на данных теста, приведет только к «пищевому 2». Проблема, с которой я сталкиваюсь, - это «все ингредиенты» для части рецепта.
Я пробовал несколько разных запросов, и все они приводят к возврату каждого рецепта.
SELECT RecipeName FROM RECIPE WHERE RecipeID IN (SELECT RecipeID FROM RECIPE_INGREDIENT WHERE IngredientID IN (SELECT IngredientID FROM INGREDIENT WHERE IngredientName IN (SELECT ItemName FROM PANTRY_ITEM)))
Есть ли у кого-нибудь идеи относительно того, как я могу это сделать? Есть ли возможный запрос для этого, или мне придется реструктурировать мою базу данных?
Это был бы более простой запрос, если бы идентификатор кладовой соответствовал идентификатору ингредиента ... но, как сейчас, так оно и будет. –