如何进行查询以仅获取值范围内具有 N 个数字的结果?
How to make a query to obtain only results that have N number within a range of values?
我正在尝试从 USDA 食品数据库中提取 MS Access 2007 中的营养数据,可在 http://www.ars.usda.gov/Services/docs.htm?docid=24912
免费获取
我需要包含 NUT_DATA.Nutr_No 中所有营养成分的记录。这些记录的值介于 '501' 和 '511' 之间。但我希望排除具有缺失值的不完整记录。
目前,Baby food banana的营养素从501到511都有,而Baby food Beverage只有所列营养素的9种,还有很多都是这样。
作为最后的手段,我想接受table所有记录,对缺失值显示null,只要每个FOOD_DES.Long_Desc正好有11条记录,每个NUT_DATA.Nutr_No OR NUTR_DEF.NutrDesc (两者一一对应).
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
// 这部分是我尝试东西的想法,但没有帮助
EXISTS (SELECT 1
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 count FOOD_DES.Long_Desc = "11" )
//结束疯狂的实验
ORDER BY FOOD_DES.Long_Desc, NUTR_DEF.SR_Order;
这是数据样本。我只是复制了最重要的专栏。红色不是我要找的,因为它没有全部 11 种营养素。如果有人认为这有帮助,我可以将整个 table 粘贴到 google 文档上。
https://docs.google.com/spreadsheets/d/1FghDD59wy2PYlpsqUlYVc3Ulwvy4MMLagpBUYtvLBfI/edit?usp=sharing
作为您的起点,确定哪些食物的所有 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 限制,这将使您的陈述更加简洁。但是,为 table 的每一行评估 Val()
意味着该方法将放弃索引检索的性能优势......因此查询版本应该明显变慢。
保存该查询并创建一个新查询,将其连接到基础 tables 以获得您需要的来自其他列的额外数据。如果您愿意,也可以将其用作子查询而不是命名查询。
我正在尝试从 USDA 食品数据库中提取 MS Access 2007 中的营养数据,可在 http://www.ars.usda.gov/Services/docs.htm?docid=24912
免费获取我需要包含 NUT_DATA.Nutr_No 中所有营养成分的记录。这些记录的值介于 '501' 和 '511' 之间。但我希望排除具有缺失值的不完整记录。
目前,Baby food banana的营养素从501到511都有,而Baby food Beverage只有所列营养素的9种,还有很多都是这样。
作为最后的手段,我想接受table所有记录,对缺失值显示null,只要每个FOOD_DES.Long_Desc正好有11条记录,每个NUT_DATA.Nutr_No OR NUTR_DEF.NutrDesc (两者一一对应).
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
// 这部分是我尝试东西的想法,但没有帮助
EXISTS (SELECT 1
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 count FOOD_DES.Long_Desc = "11" )
//结束疯狂的实验
ORDER BY FOOD_DES.Long_Desc, NUTR_DEF.SR_Order;
这是数据样本。我只是复制了最重要的专栏。红色不是我要找的,因为它没有全部 11 种营养素。如果有人认为这有帮助,我可以将整个 table 粘贴到 google 文档上。
https://docs.google.com/spreadsheets/d/1FghDD59wy2PYlpsqUlYVc3Ulwvy4MMLagpBUYtvLBfI/edit?usp=sharing
作为您的起点,确定哪些食物的所有 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 限制,这将使您的陈述更加简洁。但是,为 table 的每一行评估 Val()
意味着该方法将放弃索引检索的性能优势......因此查询版本应该明显变慢。
保存该查询并创建一个新查询,将其连接到基础 tables 以获得您需要的来自其他列的额外数据。如果您愿意,也可以将其用作子查询而不是命名查询。