Microsoft Access SQL仅返回记录,其中一组分组记录中的最后一条记录等于另一列

时间:2017-01-19 14:01:22

标签: sql ms-access

我会尽力解释我的问题及其背后的数据。

我在Microsoft Access中有一个表格结构如下。

ID1,ID2,Data1,Data2

ID1 - 是一个标识项目的数字字段(1,2,3,4等...)

ID2 - 是一个数字字段,用于标识对该项目的更改(1,2,3,4等...) 这些都是主键。记录必须都是唯一的ID。

Data1 - 包含有关更改的信息的数据字段(进行更改的用户的名称)

Data2 - 同样的事情,只是一个数据字段。

我需要对此数据运行SQL查询以返回Data1中特定项目的所有记录,其中ID1 =假设为1,ID2 =该集合中的最新记录。

ID2可以在最后一行中有所不同。因此,如果ID1为1,则该ID1可能有7个ID2,因此7将是我需要检查的行。在ID1等于2的情况下,可能有3个项目,所以现在我需要SQL来检查ID1 = 1的第7行和ID1 = 2的第3行,以确定该行中的Data1是否等于某个名称。

从我能够研究的情况来看,似乎我需要使用分组来将ID1放在一起,但是我无法找到我正在寻找的是从ID2中获取最大项目对于每组ID1。

这是我到目前为止所处的位置。

SELECT ID1, Max(ID2), Data1, Data2
FROM tbl_History
WHERE Data1 = 'name'
GROUP BY ID1
ORDER BY ID2 DESC

示例数据:

ID1  |  ID2  |  Data1  |  Data2
--------------------------------
 1       1      Name1      32
 1       2      Name2      23
 1       3      Name3      63
 1       4      Name2      53
 2       1      Name4      12
 2       2      Name5      16
 2       3      Name2      71

预期的结果是,如果我从Data1中查找Name2,我将获得1-4和2-3行。如果我在这个例子中查找Name5或除2之外的任何其他名称,我将不会收到任何行,因为没有最大ID2,其名称是Data1列。

返回的错误是Data2不是聚合函数的一部分。我在技术上已经有Data1所以我可以从返回的数据中取出,但是如何根据我的上述要求检索Data2。也许分组不是我需要的方式。

我使用VB.NET通过OleDb连接访问Microsoft Access数据库。

任何帮助将不胜感激。如果需要进一步的详细信息,请告诉我,我很乐意发布。

1 个答案:

答案 0 :(得分:1)

where子句中使用相关子查询:

select h.*
from tbl_history as h
where h.id2 = (select max(h2.id2)
               from tbl_history as h2
               where h.id1 = h2.id1
              );