【问题标题】:Trying to get one record per student to return试图让每个学生返回一个记录
【发布时间】:2017-12-14 10:31:06
【问题描述】:

总的来说,我对数据库还很陌生,我正在努力学习。我了解一些基础知识,并且主要使用 Access 内部函数来使事情正常进行,因为这是我所了解的。

我正在慢慢学习 SQL,并且在尝试阅读其他人的问题的答案时,我在推断它适用于我的数据库时遇到了很多麻烦。

我有一个名为“应用程序数据”或 [应用程序数据] 的表(我被告知在编写数据库时不应该使用空格,但此时返回并更正太多了),我正在尝试为每个有申请的学生获取最新的申请。我尝试在日期字段上使用 LAST,在 ID 字段上使用 Max,但是这两个结果最终都只产生一个返回值,以适合整个表格的那个为准,而不是每个学生最新的那个。

我已经尝试了一些其他的东西,并且已经阅读了几天,但似乎我需要一种叫做“内部连接”的东西来让它返回我需要的东西。我不确定那是什么或它是如何工作的。

无论如何,到目前为止我在 SQL 中的查询是:

SELECT DISTINCTROW [Application Data].[Most Recent Application Term]
    ,[Application Data].[Most Recent Application Year]
    ,[Application Data].[Application Date]
    ,[Application Data].[Application Status]
    ,[Application Data].[Application Decision]
    ,[Application Data].Degree
    ,[Application Data].Specialization
FROM [Application Data]
WHERE (
        (
            ([Application Data].ID) = (
                SELECT Max(ID)
                FROM [Application Data]
                )
            )
        )
GROUP BY [Application Data].[Most Recent Application Term]
    ,[Application Data].[Most Recent Application Year]
    ,[Application Data].[Application Date]
    ,[Application Data].[Application Status]
    ,[Application Data].[Application Decision]
    ,[Application Data].Degree
    ,[Application Data].Specialization
    ,[Application Data].PCID
HAVING ((([Application Data].[Application Date]) IS NOT NULL))
ORDER BY [Application Data].PCID DESC
    ,[Application Data].[Application Date] DESC;

此时我完全迷失了,但它会输入另一个表,从中更新所有报告都从中提取的主表字段。

我非常感谢任何和所有的帮助。

【问题讨论】:

标签: sql ms-access relational-database inner-join ms-access-2013


【解决方案1】:

首先给初学者一些一般性建议: 保持你的桌子干净和规范,避免空间。一个表中的每个值确实与主键相关,仅此而已。 在您的示例中,“最近的申请”实际上是指申请人而不是申请的 ID。因此,将其移至另一个表或仅将其保留在查询中。

我对您的数据库设计的建议:

  1. tbl_Application:App_ID、Student_ID、App_Date、App_Status、App_Decision、App_Specialization、App_Degree
  2. tbl_Student:Student_ID、Student_Name 等。

因此,您的申请 ID 包含您所需的信息,并将通过 Student_ID 链接到 tbl_student。 “最近的申请年份”可以添加到 tbl_student 中,并且可以通过 UPDATE 查询自动更新。

现在,让我们解决您的问题:

首先,如上所述,您的查询缺少学生信息,因此缺少应该获取最大值的字段的信息。 您的内部查询将仅输出一个值 - 所有值的最大 ID 或日期,因为它不包含用于分组的第二个字段。 将学生信息添加到表中并查询:

SELECT [Application Data].*
FROM [Application Data] INNER JOIN
    (SELECT [Application Data].[Applicant_ID],
            Max([Application Data].[Application Date] As [Most_recent_application],
     FROM [Application Data]
     GROUP BY [Applicant_ID])
    AS qry_application_max
WHERE [Application Date] = [qry_application_max].[Most_recent_application]

这应该会产生一个查询,向您显示最近的应用程序以及有关存储在表 [Application Data] 中的特定应用程序的所有信息。您可能想要运行内部查询(括号内的所有内容)以查看它是如何工作的。

这通常可以帮助您理解查询和 SQL:尝试在草稿视图中逐步构建更复杂的查询并将它们存储在数据库中。一切完成后,您可以将 SQL 代码从第一个子查询复制到主查询,并尝试截断不必要的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多