我在Microsoft Access中有一个从Sql Server视图中提取的查询。有一个修订级别字段,它是char(2)类型。因此,一个对象可以有多个修订,从" 01"开始,然后" 02",然后再开始。我想获得每个对象的最新修订记录。有没有办法设置查询来执行此操作?
答案 0 :(得分:1)
尝试类似
的内容SELECT DataTable.ItemName, DataTable.Revision
FROM DataTable
WHERE (((DataTable.Revision)=(select max(revision) from DataTable T where T.ItemName=DataTable.ItemName)));
答案 1 :(得分:0)
使用SQL无法一步完成此操作。相反,您需要先为每个产品找到正确的版本,然后获取与这些产品/修订版对匹配的记录:
要查找每种产品的修订版,您希望按产品分组并找到最高相关版本:
SELECT Test.ProductID, Max(Test.Revision) AS MaxOfRevision
FROM Test
GROUP BY Test.ProductID;
现在,您可以转到原始数据集并获取与我们新发现的ProductID / Revision对匹配的每条记录:
SELECT Test.TestID, Test.ProductID, Test.Description
FROM Test
INNER JOIN
subQ
ON (Test.Revision = subQ.MaxOfRevision) AND (Test.ProductID = subQ.ProductID);
当然,您可以创建包含以下内容的查询:
SELECT Test.TestID, Test.ProductID, Test.Description
FROM Test
INNER JOIN
(SELECT Test.ProductID, Max(Test.Revision) AS MaxOfRevision
FROM Test
GROUP BY Test.ProductID) AS subq
ON (Test.Revision = subQ.MaxOfRevision) AND (Test.ProductID = subQ.ProductID);
在列中找到最高值的唯一方法是使用Max()。 SELECT Max(Revision) FROM table;
只给出了一个值:所有记录中出现的最高revision
。 DBEngine查看它找到的每个revision
并获取最高的值。
如果我们想要对每个产品进行最高版本修订,我们需要按产品分组。现在,DBEngine会针对每个ProductID遍历表格,查看它在相应记录中找到的每个revision
,获取最高的一个并将其与其产品组相关联。
这就是为什么第一个查询的结果记录不能包含所有所需数据的原因:它们不是原始数据的子集,它们是具有一个组指示符(ProductID)和一个{{1}的新记录} -value:DBEngine可以找到的与该产品相关的所有revision
值中最高的值。
只要你的修订版中有前导零,你就可以在这里使用Max(),因为顺便说一句,它的排序方式与数字相同。在将来的应用程序中,您可能希望用数字字段替换该字段,或者在将其用作数字之前将其显式转换为数字(MAX,Sort ....)。
答案 2 :(得分:0)
我发现以下子选择也有效。
SELECT *
FROM DataTable
INNER JOIN (
SELECT JobNumber ,
MAX(CAST(RevisionLevel AS INT)) AS MaxRevision
FROM DataTable
GROUP BY JobNumber)x
ON x.JobNumber = DataTable.JobNumber AND CAST(DataTable.RevisionLevel AS INT) = x.MaxRevision