如何进行查询以仅获取在值范围内具有N个数字的结果?

时间:2015-08-11 10:48:21

标签: sql ms-access join multiple-tables

我正试图从美国农业部食品数据库中提取MS Access 2007中的营养数据,可在http://www.ars.usda.gov/Services/docs.htm?docid=24912免费获取

我需要来自NUT_DATA.Nutr_No的所有营养素的记录。这些记录的值介于'501'和'511'之间。但我希望排除缺少值的不完整记录。

目前,婴儿食品香蕉全部来自营养素501至511,但婴儿食品饮料仅列出了9种营养素,其他许多都是这样的。

作为最后的手段,我想拥有所有记录是可以接受的,只要每个FOOD_DES.Long_Desc有11条记录,每条NUT_DATA.Nutr_No或NUTR_DEF.NutrDesc(对应的彼此)。

Microsoft DirectX Typography Services

//这部分是我的想法尝试的东西,但没有帮助

DWrite.dll

//结束实验狂欢

SELECT 
FOOD_DES.NDB_No,  FOOD_DES.FdGrp_Cd, FOOD_DES.Long_Desc, NUT_DATA.Nutr_No, NUTR_DEF.NutrDesc, NUT_DATA.Nutr_Val, WEIGHT.Amount, WEIGHT.Msre_Desc, WEIGHT.Gm_Wgt, [WEIGHT]![Amount] & " " & [WEIGHT]![Msre_Desc] AS msre

FROM 
NUTR_DEF inner JOIN ((FOOD_DES INNER JOIN NUT_DATA ON FOOD_DES.NDB_No=NUT_DATA.NDB_No) INNER JOIN WEIGHT ON FOOD_DES.NDB_No=WEIGHT.NDB_No) ON NUTR_DEF.Nutr_No=NUT_DATA.Nutr_No
WHERE 
   (NUT_DATA.Nutr_No between '501' and '511'  ) and ((WEIGHT.Seq)="1") and  NUT_DATA.Nutr_Val > '0' and

这是数据样本。我刚刚复制了最重要的专栏。红色不是我想要的,因为它没有全部11种营养素。如果有人认为这会有所帮助,我可以在google doc上粘贴整个表格。

https://docs.google.com/spreadsheets/d/1FghDD59wy2PYlpsqUlYVc3Ulwvy4MMLagpBUYtvLBfI/edit?usp=sharing

1 个答案:

答案 0 :(得分:0)

作为您的起点,确定哪些食品具有价值>所有11种营养素均为0。检查这个更简单的GROUP BY查询是否显示正确的项目:

SELECT ndat.NDB_No
FROM
    NUT_DATA AS ndat
    INNER JOIN WEIGHT AS wt
    ON ndat.NDB_No = wt.NDB_No
WHERE
        ndat.Nutr_Val>0
    AND ndat.Nutr_No IN('501','502','503','504','505','506','507','508','509','510','511')
    AND wt.Seq='1'
GROUP BY ndat.NDB_No
HAVING Count(ndat.Nutr_No)=11;

请注意,您可以使用Val(ndat.Nutr_No) Between 501 And 511作为 Nutr_No 限制,这样可以为您提供更简洁的声明。但是,对表的每一行评估Val()意味着该方法会放弃索引检索的性能优势......因此查询的版本应该明显变慢。

保存该查询并创建一个新查询,该查询将其连接到基表,以获取其他列所需的其他数据。或者如果您愿意,可以将其用作子查询而不是命名查询。