Не простой запрос, потому что Access требует, чтобы вы были очень откровенны в отношении сложных внешних объединений.
SELECT tblCocktail.CocktailID, tblCocktail.CocktailName, sum(IIf(isnull(onhand.IngredientID),1,0)) AS missingIngredients
FROM (tblCocktail INNER JOIN tblCocktailIngredient ON tblCocktail.CocktailID=tblCocktailIngredient.CocktailID)
LEFT JOIN (
SELECT tblIngredient.IngredientID, tblIngredient.OnHandAmount*tblUnitConversion.Factor AS OnHandAmount, tblUnitConversion.FromUnitID AS OnHandUnitID
FROM tblIngredient INNER JOIN tblUnitConversion ON tblUnitConversion.ToUnitID=tblIngredient.OnHandUnitID
) AS onhand
ON (tblCocktailIngredient.IngredientID=onhand.IngredientID) AND (tblCocktailIngredient.UnitID=onhand.OnHandUnitID) AND (tblCocktailIngredient.Amount<=onhand.OnHandAmount)
GROUP BY tblCocktail.CocktailID, tblCocktail.CocktailName
HAVING sum(IIf(isnull(onhand.IngredientID),1,0))=0
(редактировать: понял, что мне нужен только один подзапрос)
Чтобы уточнить, яиспользовал внешнее соединение, чтобы определить, достаточно ли ингредиентов под рукой в коктейле.Исходя из этого, группировка по коктейлю позволяет мне подсчитать количество отсутствующих / не пропущенных ингредиентов в предложении HAVING.
Обратите внимание, что подзапрос 'onhand' может быть полезен для создания в качестве именованного запроса, чтобы упростить егопосмотрите, что у вас под рукой в данном отряде.