2009-09-12 103 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上沒有單個主鍵列。遊民。