程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 用SQL Server處理物料清單規則實例解析

用SQL Server處理物料清單規則實例解析

編輯:關於SqlServer

你可以通過執行兩個計數來解決這個問題。第一個計數簡單的計算每一個食譜需要的原料;第二個計數先將RecipeIngredients表與Ingredients表連接起來,再計數。從食品室中取出任何所需要的原料後都要降低這個計數,再通過比較這個計數,你就能拒絕那些你不能得到所有原料的食譜,也可以接受符合條件的食譜。我在Listing A 中提供了一個例子。(Listing A中的數據庫比我們現在討論的復雜一點點,它有一些查詢表和一些沒有提到的列。)

既然有兩個計數(需要的和可得到的),那麼我們必須對它們進行簡單的比較。我一般采取原子對分子查詢,所以我將每一條聲明都保留在視圖中(IngredientsAvailable_By_Recipe_vue 和IngredientsRequired_By_Recipe_vue)。然後,我用RecipeID字段做連接條件創建了第三個視圖,增加了一個條件那就是可得到的(Available)必須等於需要的(Required)。為了使這個列表更吸引人,我把Recipes表也加到裡面去了,所以我能獲得食譜的名字。你可以查看Listing B。你也可以去掉這個邏輯來查看食譜,你可以將WHERE語句的條件改成Required > Available,但這樣並不會簡化操作。

ListingA:

/* count the ingredients required */SELECT   
[Recipe Ingredients].RecipeID,   
Count([Recipe Ingredients].IngredientID) AS RequiredFROM   
[Recipe Ingredients]GROUP BY   
[Recipe Ingredients].RecipeID;
/* count the ingredients available */SELECT   
[Recipe Ingredients].RecipeID,   
Count(Pantry.IngredientID) AS AvailableFROM Pantry   
RIGHT JOIN [Recipe Ingredients]   
ON Pantry.IngredientID
= [Recipe Ingredients].IngredientIDGROUP BY   
[Recipe Ingredients].RecipeID;

ListingB:

SELECT   
IngredientsRequired_by_Recipe_qs.RecipeID,   
Recipes.RecipeNameFROM   
(IngredientsAvailable_By_Recipe_qs   
INNER JOIN IngredientsRequired_by_Recipe_qs   
ON IngredientsAvailable_By_Recipe_qs.RecipeID = IngredientsRequired_by_Recipe_qs.RecipeID)   
INNER JOIN Recipes   
ON IngredientsRequired_by_Recipe_qs.RecipeID
= Recipes.RecipeIDWHERE (([Available]>=[Required]));

按照早期的規定,我假定在食品室中出現的任意數量都表示這種原料是充足的。在RecipeIngredients表中需要一個Quantity列,在Pantry表中也需要一個Quantity列。(這樣會使例子變得更復雜;例如,我買了鹽,它的單位磅還是千克,食譜要求的一勺是大勺還是小勺呢?)

如果你有Quantity這個列的話,一個新的挑戰出現了:如果你想請朋友們吃午餐的話,你的菜單中用到了鳄梨醬、墨西哥沙拉和啤酒。現在的任務是比較需要的品種與食品室中現有的品種,然後再創建一個需要購買的清單。我把這問題留給感興趣的讀者去實現。

注意:你也可以先下載一個.NET executable程序,然後再創建數據庫,並在數據庫中創建你感興趣的對象,包括表中的數據。你需要安裝了.NET和SQL Server 2005才能執行這些代碼。這個程序是一個winRAR文件,但是裡面是.NET executable。代碼可以通過Red Gate Software的SQL Packager來創建,但是你不需要Red Gate就可以運行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved