SQL - 根据最近的日期更新记录

时间:2009-09-12 11:24:21

标签: sql sql-server tsql

我很难根据最近的日期更新数据库中的记录,并且正在寻找一些指导。顺便说一下,我是SQL的新手。

作为背景,我有一个带有SQL Express的Windows窗体应用程序,我正在使用ADO.NET与数据库进行交互。该应用程序旨在使用户能够跟踪员工出席必须定期参加的各种课程(例如每6个月,每年等)。例如,他们可以撤回数据以查看员工上次参加特定课程的时间,并在员工最近完成课程时更新出勤日期。

我有三个数据表:

  1. EmployeeDetailsTable - 简单的员工姓名,电子邮件地址等列表,每个都有唯一的ID
  2. CourseDetailsTable - 简单的课程列表,每个课程都有唯一的ID(例如1,2,3等)
  3. AttendanceRecordsTable - 有3列{EmployeeID,CourseID,AttendanceDate,Comments}
  4. 对于任何特定课程,员工都会有出勤记录,即如果每年需要参加课程,那么他们将拥有与公司一样多年的记录。

    我希望能够根据最近的出勤日期更新给定员工和给定课程的“评论”字段。这是什么'正确'的SQL语法?

    我尝试过很多东西(如下所示),但无法让它发挥作用:

    UPDATE AttendanceRecordsTable
    SET Comments = @Comments
    WHERE AttendanceRecordsTable.EmployeeID = (SELECT EmployeeDetailsTable.EmployeeID FROM EmployeeDetailsTable WHERE (EmployeeDetailsTable.LastName =@ParameterLastName AND EmployeeDetailsTable.FirstName =@ParameterFirstName)
    AND AttendanceRecordsTable.CourseID = (SELECT CourseDetailsTable.CourseID FROM CourseDetailsTable WHERE CourseDetailsTable.CourseName =@CourseName))
    GROUP BY MAX(AttendanceRecordsTable.LastDate)
    

    经过大量的谷歌搜索,我发现MAX是一个聚合函数,所以我需要使用GROUP BY。我也尝试过使用HAVING关键字但没有成功。

    有人能指出我正确的方向吗?基于最近日期更新数据库记录的“常规”语法是什么?

2 个答案:

答案 0 :(得分:6)

您想要更新AttendantsRecordsTable,并将评论设置为每位员工最近CourseDetailsTable的评论吗?

UPDATE 
  dbo.AttendanceRecordsTable
SET 
  Comments = @Comments
FROM
  CourseDetailsTable cd 
INNER JOIN
  Employee e ON e.EmployeeID = AttendanceRecordTable.EmployeeID
WHERE 
  e.LastName = @LastName 
  AND e.FirstName = @FirstName
  AND cd.CourseName = @CourseName
  AND AttendanceRecordsTable.CourseID = cd.CourseID
  AND AttendanceRecordsTable.LastDate = 
        (SELECT MAX(LastDate) 
           FROM AttendanceRecordsTable a
          WHERE a.EmployeeID = e.EmployeeID 
            AND a.CourseID = cd.CourseID)

我觉得这样的事情应该有用。

您基本上需要在要更新的AttendanceRecordTable与Employee和CourseDetailsTable表之间进行连接。对于这两个,您已经定义了某些参数来分别选择一行,然后您需要确保仅通过确保它是表的MAX(LastDate)来更新您执行的最后AttendanceRecordTable条目。

此处的子选择:

(SELECT MAX(LastDate) 
   FROM AttendanceRecordsTable a
  WHERE a.EmployeeID = e.EmployeeID AND a.CourseID = cd.CourseID)

将根据给定员工(LastDate)和给定课程(AttendanceRecordsTable)的选择,选择e.EmployeeIDcd.CourseID个条目的MAX(最后一个)

将其与选择配对,以按名字和姓氏选择单个员工(当然,只有在员工表中永远不会有两个John Miller时才有效)。您还可以通过课程名称选择课程,这样也必须是唯一的 - 否则您将在课程表中获得多次点击。

马克

答案 1 :(得分:0)

假设您AttendanceRecordsTable上的主键是id

UPDATE AttendanceRecordsTable SET Comments = @Comments
WHERE AttendanceRecordsTable.id = (
    SELECT AttendanceRecordsTable.id
        FROM EmployeeDetailsTable 
        JOIN AttendanceRecordsTable ON AttendanceRecordsTable.EmployeeID = EmployeeDetailsTable.EmployeeID·
        JOIN CourseDetailsTable ON AttendanceRecordsTable.CourseID = CourseDetailsTable.CourseID
    WHERE
        EmployeeDetailsTable.LastName =@ParameterLastName AND EmployeeDetailsTable.FirstName =@ParameterFirstName AND
        CourseDetailsTable.CourseName =@CourseName
    ORDER BY AttendanceRecordsTable.LastDate DESC LIMIT 1)

基本上,子选择将首先加入关注点,员工和课程详细信息表,提取员工和课程详细信息名称与参数给出的行匹配的行,并将恢复顺序的输出限制为一行。您可能希望首先测试该子选择语句。

编辑:我刚刚再次阅读您的帖子,您在AttendanceRecordsTable上没有一个主键列。长号。