查找所有零件库存的项目

时间:2012-03-26 20:09:30

标签: sql ms-access ms-access-2007 relational-division

希望相当容易查询,但我的思绪今天下午才开始工作。我有以下表格:

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大于金额,但是,我只想列出所有成分都有足够数量的鸡尾酒。

3 个答案:

答案 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