2009-09-12 125 views
3

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

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

我有三个数据表:

  1. EmployeeDetailsTable - 员工名字的简单列表,电子邮件地址等,每个都有唯一的ID
  2. CourseDetailsTable - 课程简单的列表,每个都有唯一的ID(例如1 ,2,3等)
  3. AttendanceRecordsTable - 有3列{雇员,CourseID,AttendanceDate,评论}

对于任何给定过程中,雇员将具有attenda nce的历史,即如果课程需要每年参加一次,那么他们将拥有一个在公司工作多年的记录。

我想要做的是更新给定员工的“评论”字段,并根据最近的出勤日期给出课程。什么是“正确”的SQL语法?

我已经尝试了很多东西(如下面),但不能得到它的工作:

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

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

任何人都可以指向正确的方向吗?根据最近的日期更新数据库记录的“常规”语法是什么?

回答

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表之间进行连接。对于这两个,你已经定义了某些参数来选择每一行,然后你需要确保只更新最后的AttendanceRecordTable条目,通过确保它是表格的MAX(LastDate)。

的位置再选择:

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

将在AttendanceRecordsTable选择MAX的LastDate项(最后一个),基于给定的雇员(e.EmployeeID)和给定的课程(cd.CourseID)的选择。

与选择通过名字和姓氏选择单个员工的联系(当然,只有在员工表中永远不会有两个John Miller!)。您还可以通过课程名称选择课程,因此也必须是唯一的 - 否则您将在课程表中获得多个匹配。

马克

+1

date =(从表z中选择max(date),其中z.FK = FK)总是一个很好的解决方案 – cjk 2009-09-12 11:39:17

+0

+1 - 很好的解释 – 2009-09-12 11:43:03

+0

Marc - Thanbks的帖子。让我给出一个结果,并返回结果... – 2009-09-12 11:52:48

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 [email protected] AND EmployeeDetailsTable.FirstName [email protected] AND 
     CourseDetailsTable.CourseName [email protected] 
    ORDER BY AttendanceRecordsTable.LastDate DESC LIMIT 1) 

基本上,该子选择将首先参加考勤,员工和coursedetail表,提取这些行,其中员工的和课程详细信息“的名称与您的参数中给出的名称相匹配,并将回复顺序的输出限制为一行。您可能首先要测试该子选择语句。

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