MS Access查询以返回表中具有多个记录的每个人的最新日期

时间:2019-06-27 22:12:09

标签: sql ms-access

我有一个由健康计划成员组成的表格。

每条记录代表一项承保范围的选择或其承保范围的变化,包括生效日期。例如,每个成员都在1月进行初始计划选举。如果成员在3月生了孩子,并将其覆盖范围从单身家庭改为个人+家庭,则会创建一个具有新生效日期的记录。原始记录保留在表中,并创建具有新覆盖率选择的新记录。

我需要创建一个查询,以获取表中每个成员的最新覆盖范围,无论是一月份的原始选举还是三月份的最新覆盖范围更改。

我尝试了一些不同的SQL语句,但是没有一个能正确解决。

该表称为$> curl -i -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "abc+123/XYZ=" http://localhost:8080/testing\?x\=\&Z\=U HTTP/1.1 400 Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Date: Thu, 27 Jun 2019 21:57:35 GMT Connection: close {"timestamp":"2019-06-27T21:57:35.516+0000","status":400,"error":"Bad Request","message":"Required request body is missing: public java.lang.String com.example.demo.stuff.MyController.myMapping(java.lang.String)","path":"/testing"}% 。下面的查询返回了3条记录,甚至不确定该如何计算。我想返回每个成员最近一次选举的全部记录。

任何帮助将不胜感激。谢谢!

tblPreviousExport

1 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一目标-


使用联接的子查询:

一种可能的方法是在子查询上使用inner join,该子查询为每个Employee SSN选择最大的生效日期:

select t1.*
from tblPreviousExport t1 inner join
(
    select t2.[Employee SSN], max(t2.[Effective Date]) as md
    from tblPreviousExport t2
    group by t2.[Employee SSN]
) q 
on t1.[Employee SSN] = q.[Employee SSN] and t1.[Effective Date] = q.md

使用相关子查询:

另一种方法是使用相关的子查询,该子查询尝试选择日期晚于当前记录的记录,然后返回该子查询不返回任何结果的记录(由where not exists子句表示):< / p>

select t1.*
from tblPreviousExport t1 where not exists 
(
    select 1 from tblPreviousExport t2 
    where 
    t1.[Employee SSN]   = t2.[Employee SSN] and
    t1.[Effective Date] < t2.[Effective Date]
)

使用具有不相等加入条件的LEFT JOIN

最后,您还可以通过以下方式对left join使用不相等的联接条件,返回在联接右侧没有满足联接条件的记录的记录:

select t1.* 
from 
    tblPreviousExport t1 left join tblPreviousExport t2 on 
    t1.[Employee SSN]   = t2.[Employee SSN] and
    t1.[Effective Date] < t2.[Effective Date]
where 
    t2.[Effective Date] is null

此示例只能在SQL视图的MS Access中表示,因为MS Access查询设计器无法显示具有相等联接条件(即,一个字段等于另一个字段)的联接。

此示例的操作与相关子查询相似,但选择是通过联接执行的,而不是在WHERE子句中进行的。