Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Access查询每个select max语句只返回1个max date结果_Sql_Ms Access - Fatal编程技术网

Sql Access查询每个select max语句只返回1个max date结果

Sql Access查询每个select max语句只返回1个max date结果,sql,ms-access,Sql,Ms Access,我在这件事上绞尽脑汁已经有一段时间了 我正在使用一个旧的Access数据库,我正在逐步淘汰/替换该数据库,出现了一个问题,在查询中出现了重复记录,我们以前从未看到过重复记录 我们从几个表中提取到期日期,查询返回每个人的每个证书的最新到期日期 整个查询相当大,但问题是,每个过期表都有重复的连接,如下所示: SELECT Courses.[id], Person.FirstName, Person.MiddleName, Person.LastName, Courses.Code, Codes.Na

我在这件事上绞尽脑汁已经有一段时间了

我正在使用一个旧的Access数据库,我正在逐步淘汰/替换该数据库,出现了一个问题,在查询中出现了重复记录,我们以前从未看到过重复记录

我们从几个表中提取到期日期,查询返回每个人的每个证书的最新到期日期

整个查询相当大,但问题是,每个过期表都有重复的连接,如下所示:

SELECT Courses.[id], Person.FirstName, Person.MiddleName, Person.LastName, Courses.Code, Codes.Name, Courses.Date, Courses.[P/F/I/C], Courses.ExpirationDate, Courses.Grade
FROM Codes INNER JOIN (Courses INNER JOIN Person ON Courses.[id] = Person.[id]) ON Codes.Code = Courses.Code
WHERE (
    Courses.ExpirationDate = (SELECT MAX(ExpirationDate) FROM Courses b WHERE b.ExpirationDate >= Date() AND (b.[id] = Courses.[id]) AND b.Code = 'c0' AND ((b.[P/F/I/C])='P' Or (b.[P/F/I/C])='C'))
) OR (
    Courses.ExpirationDate = (SELECT MAX(ExpirationDate) FROM Courses b WHERE b.ExpirationDate >= Date() AND (b.[id] = Courses.[id]) AND b.Code = 'c1' AND ((b.[P/F/I/C])='P' Or (b.[P/F/I/C])='C'))
) OR (
    Courses.ExpirationDate = (SELECT MAX(ExpirationDate) FROM Courses b WHERE b.ExpirationDate >= Date() AND (b.[id] = Courses.[id]) AND b.Code = 'c2' AND ((b.[P/F/I/C])='P' Or (b.[P/F/I/C])='C'))
) OR (
    Courses.ExpirationDate = (SELECT MAX(ExpirationDate) FROM Courses b WHERE b.ExpirationDate >= Date() AND (b.[id] = Courses.[id]) AND b.Code = 'c3' AND ((b.[P/F/I/C])='P' Or (b.[P/F/I/C])='C'))
) OR (
    Courses.ExpirationDate = (SELECT MAX(ExpirationDate) FROM Courses b WHERE b.ExpirationDate >= Date() AND (b.[id] = Courses.[id]) AND b.Code = 'c4' AND ((b.[P/F/I/C])='P' Or (b.[P/F/I/C])='C'))
) OR (
    Courses.ExpirationDate = (SELECT MAX(ExpirationDate) FROM Courses b WHERE b.ExpirationDate >= Date() AND (b.[id] = Courses.[id]) AND b.Code = 'c5' AND ((b.[P/F/I/C])='P' Or (b.[P/F/I/C])='C'))
) OR (
    Courses.ExpirationDate = (SELECT MAX(ExpirationDate) FROM Courses b WHERE b.ExpirationDate >= Date() AND (b.[id] = Courses.[id]) AND b.Code = 'c6' AND ((b.[P/F/I/C])='P' Or (b.[P/F/I/C])='C'))
) OR (
    Courses.ExpirationDate = (SELECT MAX(ExpirationDate) FROM Courses b WHERE b.ExpirationDate >= Date() AND (b.[id] = Courses.[id]) AND b.Code = 'c7' AND ((b.[P/F/I/C])='P' Or (b.[P/F/I/C])='C'))
)
ORDER BY Courses.[id], Courses.Code

如果这些或子句中的一个在过期之前对单个类别中的单个人员进行了重新认证,则查询将返回这两条记录。它应该只返回这两条记录的最大值。你知道我在上面的问题中遗漏了什么吗?如果有帮助的话,我可以发布这个嵌套查询的其余部分,但我很确定这就是问题所在。

我猜你真的想要这个:

WHERE Courses.ExpirationDate = (SELECT MAX(b.ExpirationDate)
                                FROM Courses b
                                WHERE b.ExpirationDate >= Date() AND
                                      b.[id] = Courses.[id] AND
                                      b.Code IN ('c0', 'c1', . . .) AND
                                      b.Code = Courses.Code AND
                                      b.[P/F/I/C]) IN ('P', 'C')
                               )

这是一个单独的条件,代码上有一个附加的相关条件。

谢谢!实际上,我最终只能像您所说的那样执行一个select MAX查询,但由于父查询中的每个课程都必须重复该查询,因此我可以删除所有ORs,只需为每个课程执行一次select MAX查询。因此,与其让所有的ORs只包含课程,不如从课程b中选择MAXExpirationDate,其中b.ExpirationDate>=Date和b.[id]=Courses.[id]和b.Code='c6'和b.[P/F/I/C]='P'或b.[P/F/I/C]='C',我将在'P','C'逻辑中采用您的和[P/F/I/C],因为这样更简洁。谢谢