2012-03-26 24 views
0

希望能夠相當容易的查詢,但我的思想今天下午不工作。我有如下表:查找項目所有部件有庫存

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])); 

這將給所有的雞尾酒及相關食材的現有量高於量大的名單,但是,我只想列出雞尾酒,其中所有成分上有足夠的數量手。

+0

Hos是與其他表相關的tblUnitConversion?您是否試圖指定tblCocktailIngredient數量中的行數量必須乘以100才能與「tblIngredient」中的某行相比? – jhenderson2099 2012-03-26 20:32:53

+0

實際上,來自tblIngredient的行的OnHandAmount必須乘以100才能與tblCocktailIngredient上的「Amount」字段進行比較。 – NickHeidke 2012-03-26 20:38:01

+0

您需要說的是「哪裏的成分的含量少於手頭所需的量」,即「不存在」或類似情況。 – Ben 2012-03-26 22:29:45

回答

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) 
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 
+0

這將不會在MS Access中運行,沒有足夠的括號。 – Fionnuala 2012-03-27 13:44:13

+0

看起來括號是匹配的。訪問必須抱怨別的東西?此SQL將在SQL Server中工作。 – jhenderson2099 2012-03-27 15:39:08

+0

由於Access不會重新排序連接(請參閱我的答案中的抱怨),它要求您將括號放在每對連接的周圍,而不是最後一個。 – Simon 2012-03-27 15:56:59

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'子查詢可能有助於創建一個命名的查詢,以便輕鬆查看給定單元中的現有內容。

+0

在完善了查詢之後,我意識到,儘管我對Access有所詬病,但除了''IIf(isnull())'Access方言外,我還會在其他數據庫中執行此查詢。我最初的做法有一個模糊的外部連接,即拒絕訪問,但我現在意識到它會給出不正確的結果。 – Simon 2012-03-27 15:39:07

+0

將'HAVING'子句右側的'0'更改爲'1'或'2'也可以讓你回答「如果我有一兩種成分,我可以做些什麼?」 – Simon 2012-03-27 18:39:05

相關問題