我正在使用MS Access 2013中的食品购买/发票系统,正在尝试创建一个SQL查询,该查询将返回每个食品的最新购买价格。
我对SQL的理解是非常基础的,因此我尝试了以下(不正确的)查询,希望它对每个项目仅返回一条记录(由于DISTINCT
运算符),并且仅返回最近的购买记录(因为我做了ORDER BY [Invoice Date] DESC
)
SELECT DISTINCT ([Food items].Item),
[Food items].Item, [Food purchase data].[Price per unit], [Food purchase data].[Purchase unit], Invoices.[Invoice Date]
FROM Invoices
INNER JOIN ([Food items]
INNER JOIN [Food purchase data]
ON [Food items].ID = [Food purchase data].[Food item ID])
ON Invoices.ID = [Food purchase data].[Invoice ID]
ORDER BY Invoices.[Invoice Date] DESC;
但是,上面的查询仅返回所有食品购买(即中的每个记录有多个记录[Food items]
),结果按日期降序排列。有人可以向我解释我对DISTINCT
操作员的误解吗?也就是说,为什么它不只为其中的每一项返回一个记录[Food items]
?
更重要的是- 给定上面显示的表格结构,对于我来说,仅提取每个食品的最新食品购买数据的最简单方法是什么?我并没有真正关心效率,而是简单性(我正在使用的数据库相当小-甚至数以万计的记录范围还需要很多年)。我更关心查询对于那些不了解SQL的人来说是可以理解的。
更新: 所以我尝试了下面建议的两个答案,但两个都不起作用(它们只是引发语法错误)。
根据以下建议,并进一步在线阅读,我使用了聚合函数max()
和一个GROUP BY
子句编写了以下新查询:
SELECT [Food purchase data].[Food item ID], [Food purchase data].[Price per unit], max(Invoices.[Invoice Date]) AS MostRecentInvoiceDate
FROM [Food purchase data], Invoices
GROUP BY [Food purchase data].[Food item ID], [Food purchase data].[Price per unit];
但是我仍然遇到同样的问题:也就是说,每种食物我仍然看到不止一个结果。谁能解释为什么这个查询不仅返回每个食品的最新购买信息?
更新2(已解决!):
以下所有答案均未完全解决,但是基于以下弗拉基米尔答案的重大修改,我能够创建以下查询,这些查询似乎给出了正确的结果。
首先,我创建了该视图并将其命名为“ LatestInvoices”:
SELECT InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDate, InvoicesMaxDate.MaxID
FROM [Food purchase data], Invoices, (SELECT [Food purchase data].[Food item ID] AS ItemID, MAX(Invoices.[Invoice Date]) AS MaxDate, MAX(Invoices.[Invoice ID]) AS MaxID
FROM [Food purchase data], Invoices
WHERE Invoices.[Invoice ID] = [Food purchase data].[Invoice ID]
GROUP BY [Food purchase data].[Food item ID]
) AS InvoicesMaxDate
WHERE InvoicesMaxDate.MaxID = [Food purchase data].[Invoice ID] AND
InvoicesMaxDate.ItemID = [Food purchase data].[Food item ID] AND
InvoicesMaxDate.MaxDate = Invoices.[Invoice Date]
GROUP BY InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDate, InvoicesMaxDate.MaxID
然后,我编写了另一个查询以提取所需的字段:
SELECT [Food items].ID AS FoodItemID, [Food items].Item AS FoodItem, [Food purchase data].[Price], [Food purchase data].[Price per unit], [Food purchase data].[Purchase unit], LatestInvoices.MaxDate as InvoiceDate
FROM [Food items], [Food purchase data], LatestInvoices
WHERE LatestInvoices.[MaxID] = [Food purchase data].[Invoice ID] AND
LatestInvoices.ItemID = [Food purchase data].[Food item ID] AND
LatestInvoices.ItemID = [Food items].ID
ORDER BY [Food items].Item;
感谢所有花时间帮助我的人!
[
和包围一切]
ID
列中都包含表的名称,因此ID
在Invoices
表中变为InvoiceID
。
DISTINCT
是单列的。是否有一个类似的运算符将仅基于单个列中的唯一性进行选择?另外,感谢有关命名约定的提示-是的,不得不在[ ... ]
任何地方使用都是非常烦人的事……而且我可以看到在ID列中包含表名将如何提高可读性。
DISTINCT
返回在该行的所有列(而不是单个列)中不同的行。