【问题标题】:Microsoft Access SQL to return only records where the last record in a set of grouped records equals something in another columnMicrosoft Access SQL 仅返回一组分组记录中的最后一条记录等于另一列中的某项的记录
【发布时间】:2017-01-19 22:21:24
【问题描述】:

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

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

ID1、ID2、数据1、数据2

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 检查第 7 行的 ID1=1 和第 3 行的 ID1=2 以确定该行中的 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 数据库。

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

【问题讨论】:

  • 一般的 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数!
  • 很好,但是如果是日期、文本或数字,我应该使用什么函数从 Data2 中检索数据。这就是为什么我觉得分组不是要走的路。
  • 添加一些示例表数据和预期结果。 (以及格式化文本。)
  • 我添加了一些示例数据和预期的结果。
  • 无需再花时间在这上面。戈登的回答完美。我只是在第一次尝试时就搞砸了。感谢您的时间 jarlh,我很感激。

标签: sql ms-access


【解决方案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
              );

【讨论】:

  • 这感觉就像我正在寻找的,但我收到以下错误。 Microsoft Access 数据库引擎无法将“h.*”识别为有效的字段名称或表达式。我可能应该提到我正在使用 VB.NET 通过 OleDb 连接访问 Microsoft Access 数据库。如果我有其他选择,我会使用它,但这是我们公司给我们的。我将使用此信息更新原始问题。
  • 我的错字。原来我忘记了 tbl_history 行末尾的“as h”。这似乎完全按照需要工作。感谢您的快速回复,对于我无法准确输入给我的内容,我深表歉意! :)
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 2015-02-09
  • 2022-01-27
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
相关资源
最近更新 更多