MS Access子查询

时间:2017-06-20 18:54:09

标签: sql ms-access subquery

我有两个表(tbl_rules和tbl_versions),结构如下:

tbl_rules

rule_ID*, txtSource, txtDescription.....

tbl_versions

version_ID*, rule_ID, version.....

tbl_rules中的每个规则都有一个uniq rule_ID。 tbl_versions使用主要的version_ID,它与rule_ID上的tbl_rules绑定,而version只是一个整数,实际上表示它是什么版本的规则(1,2,3等)。 tbl_versions为每个rule_ID都有多个版本。我的问题是我正在尝试创建一个填充表单的查询,该表单显示我的所有规则和最新版本。

3 个答案:

答案 0 :(得分:0)

您需要首先使用group by获取最新版本,然后使用JOIN返回规则表,例如

select r.*, xxx.highest_version
from tbl_rules r
join (
select rule_id, max(version) as highest_version
from tbl_versions
group by rule_ID ) xxx on r.rule_id = xxx.rule_id;

答案 1 :(得分:0)

将数据集定义为:

  • x是一组数据,每个rule_Id
  • 的max(version_ID)
  • r是规则
  • v是版本

我相信您需要获得每个rule_ID的max(version_ID)才能从tbl_version获取最新版本。我怀疑version只包含有关版本的文字。如果一个人得到它的最大值,我怀疑它是最新的。"我们可能会使用存在和相关的子查询,但这是一种方法。

这应该有效,因为x结果集只有一个版本记录PER规则。该版本记录将是具有HIGHEST version_ID的版本记录。 (这假定最高版本_Id是最新记录)。我还假设您需要的不仅仅是ID,因此请返回版本表以获取version字段值。

SELECT R.*, v.*
FROM tbl_rules r
INNER JOIN tbl_versions V
  on r.Rule_ID = V.Rule_ID
INNER JOIN (SELECT rule_id, max(version_ID) as max_version_ID
      FROM tbl_versions
      GROUP BY rule_ID ) x 
  on V.rule_id = x.rule_id
 and V.max_version_ID = x.Version_Id

注意:其他RDBMS系统支持窗口函数,交叉应用可能会消除步骤

答案 2 :(得分:0)

感谢@xQbert和@Ruhal的帮助。终于得到了一个有效的答案。

SELECT tbl_rules.*, tbl_versions.*
FROM tbl_rules INNER JOIN tbl_versions ON tbl_rules.Rule_ID = tbl_versions.Rule_ID
WHERE (((tbl_versions.version_id) In (SELECT Max(x.version_ID) AS max_version_ID
FROM tbl_versions AS x
GROUP BY x.rule_ID)))
ORDER BY tbl_rules.rule_ID;