我正在尝试构建一个获取以下数据的 SQL 查询:
+-------------+--------+---------+---------+--------+
| Primary Key | ID | Version | Class | Fruit? |
+-------------+--------+---------+---------+--------+
| 1 | Banana | 1 | NORTH | Yes |
| 2 | Onion | 1 | WEST | No |
| 3 | Orange | 1 | NA | Yes |
| 4 | Orange | 2 | PACIFIC | Yes |
| 5 | Banana | 2 | EUR | Yes |
| 6 | Celery | 1 | EUR | No |
| 7 | Celery | 3 | SOUTH | No |
| 8 | Celery | 4 | SOUTH | No |
| 9 | Pepper | 1 | N-PAC | No |
| 10 | Pepper | 2 | N-PAX | No |
+-------------+--------+---------+---------+--------+
Fruit
并返回最新版本的ID和其对应的数据,其中检查的标准。
需要一个 SQL 字符串来返回 Max 版本的 ID 和类,其中Fruit = No
结果:
+--------+-------+
| ID | Class |
+--------+-------+
| Onion | NORTH |
| Celery | SOUTH |
| Pepper | N-PAX |
+--------+-------+
我只需要返回 ID 及其类以存储在 MS Access 列表框中。
我设法在编辑器中构建了一个 Group By / Max 查询,并且只能够获取要返回分组的 ID,但是相应的数据与最大版本无关。
感谢您的帮助和专业知识。
答案1
有多种方法可以实现这一点。
以下所有示例都假设您的表已命名table1
,并且您的字段为id
、、class
和version
(fruit
不是fruit?
) - 请根据需要更改这些以适合您的数据。
笔记:以下示例假设您的fruit
领域是文本领域。如果你的fruit
领域实际上是布尔值(是/否)'No'
字段,然后删除以下示例中的单引号。
使用连接子查询:
select u.id, u.class
from table1 u inner join
(
select t.id, max(t.version) as mv
from table1 t
where t.fruit = 'No'
group by t.id
) v on u.id = v.id and u.version = v.mv
version
在这里,子查询为每个id
记录选择最大的一个,其中和然后将其连接到完整的数据集以返回每个和fruit = 'No'
所需的字段。id
version
使用相关子查询:
select t.id, t.class
from table1 t
where t.fruit = 'No' and not exists
(select 1 from table1 u where u.id = t.id and u.fruit = 'No' and u.version > t.version)
这里,选择完全在WHERE
子句中执行,对于每个记录,测试集合中是否存在另一个具有相同id
和更大的记录version
,如果是,则不返回该记录。
使用LEFT JOIN
不平等的连接标准:
select t.id, t.class
from table1 t left join table1 u on t.id = u.id and t.version < u.version
where t.fruit = 'No' and u.id is null
此示例只能在 SQL 视图中的 MS Access 中表示,因为 MS Access 查询设计器无法显示具有相同连接条件的连接(即一个字段等于另一个字段)。
此示例的操作与相关子查询类似,但选择是由连接执行的,而不是在子句内执行的WHERE
。
最后,请注意您给出的示例结果是不正确的:的class
最大值version
的id = 'Onion'
应该是WEST
,而不是NORTH
。