時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
你可以通過(guò)執(zhí)行兩個(gè)計(jì)數(shù)來(lái)解決這個(gè)問(wèn)題。第一個(gè)計(jì)數(shù)簡(jiǎn)單的計(jì)算每一個(gè)食譜需要的原料;第二個(gè)計(jì)數(shù)先將RecipeIngredients表與Ingredients表連接起來(lái),再計(jì)數(shù)。從食品室中取出任何所需要的原料后都要降低這個(gè)計(jì)數(shù),再通過(guò)比較這個(gè)計(jì)數(shù),你就能拒絕那些你不能得到所有原料的食譜,也可以接受符合條件的食譜。我在Listing A 中提供了一個(gè)例子。(Listing A中的數(shù)據(jù)庫(kù)比我們現(xiàn)在討論的復(fù)雜一點(diǎn)點(diǎn),它有一些查詢表和一些沒有提到的列。)
既然有兩個(gè)計(jì)數(shù)(需要的和可得到的),那么我們必須對(duì)它們進(jìn)行簡(jiǎn)單的比較。我一般采取原子對(duì)分子查詢,所以我將每一條聲明都保留在視圖中(IngredientsAvailable_By_Recipe_vue 和IngredientsRequired_By_Recipe_vue)。然后,我用RecipeID字段做連接條件創(chuàng)建了第三個(gè)視圖,增加了一個(gè)條件那就是可得到的(Available)必須等于需要的(Required)。為了使這個(gè)列表更吸引人,我把Recipes表也加到里面去了,所以我能獲得食譜的名字。你可以查看Listing B。你也可以去掉這個(gè)邏輯來(lái)查看食譜,你可以將WHERE語(yǔ)句的條件改成Required > Available,但這樣并不會(huì)簡(jiǎn)化操作。
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]));
按照早期的規(guī)定,我假定在食品室中出現(xiàn)的任意數(shù)量都表示這種原料是充足的。在RecipeIngredients表中需要一個(gè)Quantity列,在Pantry表中也需要一個(gè)Quantity列。(這樣會(huì)使例子變得更復(fù)雜;例如,我買了鹽,它的單位磅還是千克,食譜要求的一勺是大勺還是小勺呢?)
如果你有Quantity這個(gè)列的話,一個(gè)新的挑戰(zhàn)出現(xiàn)了:如果你想請(qǐng)朋友們吃午餐的話,你的菜單中用到了鱷梨醬、墨西哥沙拉和啤酒?,F(xiàn)在的任務(wù)是比較需要的品種與食品室中現(xiàn)有的品種,然后再創(chuàng)建一個(gè)需要購(gòu)買的清單。我把這問(wèn)題留給感興趣的讀者去實(shí)現(xiàn)。
注意:你也可以先下載一個(gè).NET executable程序,然后再創(chuàng)建數(shù)據(jù)庫(kù),并在數(shù)據(jù)庫(kù)中創(chuàng)建你感興趣的對(duì)象,包括表中的數(shù)據(jù)。你需要安裝了.NET和SQL Server 2005才能執(zhí)行這些代碼。這個(gè)程序是一個(gè)winRAR文件,但是里面是.NET executable。代碼可以通過(guò)Red Gate Software的SQL Packager來(lái)創(chuàng)建,但是你不需要Red Gate就可以運(yùn)行。(T006)
關(guān)鍵詞標(biāo)簽:SQL Server
相關(guān)閱讀
熱門文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系
人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法