希望相当容易查询,但我的思绪今天下午才开始工作。我有以下表格:
tblCocktail
CockTailID CocktailName
1 Alexander
tblCocktailIngredient
CocktailID IngredientID Amount UnitID
1 1 3 1
1 2 3 1
1 3 3 1
tblIngredient
IngredientID IngredientName OnHandAmount OnHandUnitID
1 Cognac .75 2
2 Creme de Cacao .9 2
3 Cream .5 2
tblUnitConversion
FromUnitID ToUnitID Factor
1 2 100
我想要做的是找到一份我可以制作的鸡尾酒清单,因为我手头上有足够的所有成分。我有以下查询:
SELECT tblCocktail.CocktailName
FROM tblCocktail INNER JOIN (tblIngredient INNER JOIN (tblCocktailIngredient INNER JOIN tblUnitConversion ON tblCocktailIngredient.UnitID = tblUnitConversion.ToUnitID) ON (tblIngredient.IngredientID = tblCocktailIngredient.IngredientID) AND (tblIngredient.OnHandUnit = tblUnitConversion.FromUnitID)) ON tblCocktail.CocktailID = tblCocktailIngredient.CocktailID
WHERE ((([tblCocktailIngredient].[Amount]*[Factor])<[tblIngredient].[OnHandAmount]));
这将列出所有鸡尾酒和相关成分,其中onHand大于金额,但是,我只想列出所有成分都有足够数量的鸡尾酒。
答案 0 :(得分:1)
SELECT tblCocktail.CocktailName
FROM tblCocktail
WHERE ( SELECT COUNT(*)
FROM tblCocktailIngredient
WHERE tblCocktailIngredient.CocktailID = tblCocktail.CockTailID)
=
( SELECT COUNT(*)
FROM tblIngredient
INNER JOIN (tblCocktailIngredient
INNER JOIN tblUnitConversion
ON tblCocktailIngredient.UnitID = tblUnitConversion.FromUnitID)
ON (tblIngredient.IngredientID = tblCocktailIngredient.IngredientID)
AND (tblIngredient.OnHandUnitId = tblUnitConversion.ToUnitID)
WHERE [tblCocktailIngredient].[Amount] <= [tblIngredient].[OnHandAmount]*[Factor]
AND tblCocktailIngredient.CocktailID = tblCocktail.CocktailID )
答案 1 :(得分:1)
不是一个简单的查询,因为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'子查询可能对创建命名查询很有用,可以让您轻松查看给定单位中手头的内容。
答案 2 :(得分:0)
我相信这就是你要找的东西:
select result1.CocktailName
from (
select tblCocktail.CocktailName, count(*) as NumIngredientsPerCocktail
from tblCocktail
inner join tblCocktailIngredient
on tblCocktail.CocktailID = tblCocktailIngredient.CocktailID
group by tblCocktail.CocktailName
) as result1
inner join (
select tblCocktail.CocktailName, count(*) as NumberAvailableIngredientsForCocktail
from tblCocktail
inner join tblCocktailIngredient
on tblCocktail.CocktailID = tblCocktailIngredient.CocktailID
inner join tblIngredient
on tblCocktailIngredient.IngredientID = tblIngredient.IngredientID
inner join tblUnitConversion
on tblUnitConversion.FromUnitID = tblCocktailIngredient.UnitID
and tblUnitConversion.ToUnitID = tblIngredient.OnHandUnitID
where tblIngredient.OnHandAmount * tblUnitConversion.Factor >= tblCocktailIngredient.Amount
group by tblCocktail.CocktailName
) as result2
on result1.NumIngredientsPerCocktail = result2.NumberAvailableIngredientsForCocktail
and result1.CocktailName = result2.CocktailName