2017-05-03 79 views
2

我正在爲學校做一個小項目是sql。我使用MS Access作爲我的數據庫引擎。使用select和where子句更新查詢

我試圖計算和更新項目階段與一個階段的實際結束日期由該階段中的任務的最後一個實際結束日期。 此查詢返回一個提示,要求我輸入「meet.PhaseId」的值。

UPDATE ProjectPhases 
SET RealEndDate = (SELECT MAX(asgn.RealEndDate) AS RealEndDate 
        FROM Assignments AS asgn 
        INNER JOIN 
        (
        Meetings AS meet 
        INNER JOIN ProjectPhases 
        ON meet.PhaseId = ProjectPhases.PhaseId 
        ) 
        ON asgn.MeetingId = meet.MeetingId 
        WHERE meet.PhaseId = ProjectPhases.PhaseId 
        vAND asgn.RealEndDate IS NOT NULL) 
WHERE meet.PhaseId = ProjectPhases.PhaseId; 

Database structure (image)

+1

「不工作」不是一種描述,可以幫助您獲得有價值的答案。嘗試在問題描述中更加精確。 – Plirkee

+0

@Plirkee Tnx,我是新來的。編輯我的問題。 –

回答

2

考慮將您的聚合查詢保存在單獨的查詢中,然後在更新查詢中使用域聚合DLookUp()。在MS Access SQL(與其他方言不同)中,更新查詢必須保留可更新條件(或非read-only),這會排除聚合查詢的使用。

SELECT查詢(無ProjectPhases加入)

SELECT meet.PhaseId, MAX(asgn.RealEndDate) AS MaxRealEndDate 
FROM Assignments AS asgn 
INNER JOIN Meetings AS meet 
ON asgn.MeetingId = meet.MeetingId 
WHERE asgn.RealEndDate IS NOT NULL 
GROUP BY meet.PhaseId 

UPDATE查詢

UPDATE ProjectPhases p 
SET p.RealEndDate = DLookUp("MaxRealEndDate", "myaggQuery", "PhaseId=" & p.PhaseId) 

或者,你可能會考慮一個嵌套域聚合,以避免所保存的骨料查詢:

UPDATE ProjectPhases p 
SET p.RealEndDate = DMax("RealEndDate", "Assignments", "MeetingId=" & 
         DLookUp("MeetingId", "Meetings", "PhaseId=" & p.PhaseId) & 
         " AND RealEndDate IS NOT NULL") 
+0

因此,使用MS Access時,無法在純SQL中執行此操作? –

+0

如前所述,包含聚合查詢的不可更新查詢不能用於MS Access SQL方言中的更新查詢。現在,您可以創建一個聚合查詢結果表,然後使用'UPDATE tbl INNER JOIN othertbls ... SET',因爲此連接可更新且不包含「GROUP BY」。 – Parfait

0

你不會從你的子查詢中選擇meet.PhaseId,因此沒有PhaseId存在篩選依據。

使用GUI設計器逐步構建查詢通常更容易。

+0

當我添加PhaseId到子查詢時,我得到「你已經寫了一個子查詢,可以返回多個字段,而不需要在主查詢的FROM子句中使用EXISTS保留字,修改子查詢的SELECT語句只需要一個字段。錯誤3306)「 我不能使用gui,這裏的品脫是爲了學習sql –

+0

你的錯誤和問題是非常基本的,所以使用GUI設計器和學習SQL。和/或瀏覽SQL指南。 – Gustav