我会尽力解释我的问题及其背后的数据。
我在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数据库。
任何帮助将不胜感激。如果需要进一步的详细信息,请告诉我,我很乐意发布。
答案 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
);