2013-03-06 101 views
0

我看不出在這裏真的看起來和我一樣的東西,雖然它可能只是我沒有做這麼長時間的SQL。SQL更新查詢與MAX

所以我有一個主表TestTempGeneralInfo和一個dail TestTaskGeneralInfo。我可以使用此查詢:

SELECT testtempgeneralinfo.issueid, 
     Max(testtaskgeneralinfo.effectivetime) 
FROM testtaskgeneralinfo 
     INNER JOIN testtempgeneralinfo 
       ON testtaskgeneralinfo.testtemplateid = 
        testtempgeneralinfo.issueid 
WHERE testtempgeneralinfo.projectid = 150 
GROUP BY testtempgeneralinfo.issueid 

查看TestTaskGeneralInfo表的最大有效時間。

但我正在努力編寫查詢來更新同一列TestTempGeneralInfo。誰能幫忙?希望這不是一個愚蠢的問題。謝謝

+0

爲什麼要到MAX存儲在任何列?這樣,您可以在任何時候添加/更新/刪除任何行時將其保留在所有行中?當你想知道最大值時,只需運行你已有的查詢。沒有理由保存這些信息。 – 2013-03-06 21:02:26

+0

您*無法*更新表達式或聚合函數返回的值。具體來說,由'Max(testtaskgeneralinfo.effectivetime)'返回的值返回'testtaskgeneralinfo'中'effectivetime'字段中存儲的最大值* – Barranka 2013-03-06 21:20:45

回答

0

有幾種不同的方法可以做到這一點,但最簡單的方法可能就是將上面的查詢轉化爲公用表表達式,然後將更新語句加入到CTE中:

;WITH MaxDate AS 
    (SELECT testtemplateid, Max(effectivetime) as MaxEffectiveTime 
     FROM testtaskgeneralinfo 
     GROUP BY testtemplateid) 
    UPDATE testtempgeneralinfo 
    SET effectivetime = MaxEffectiveTime 
    FROM MaxDate 
    INNER JOIN testtempgeneralinfo 
      ON MaxDate.testtemplateid = testtempgeneralinfo.issueid 
    WHERE testtempgeneralinfo.projectid = 150 

編輯:對不起,有一個複製/粘貼錯誤那裏。但是,上面假設你想用最新的testtaskgeneralinfo的有效時間來更新testtempgeneralinfo的有效時間。

+0

這就是CTE的名稱。可以以其他方式完成它並首先進行testtempgeneralinfo,但它可以以任何方式工作。 – 2013-03-06 21:36:27

+0

對不起,錯過了。 – 2013-03-06 21:39:40

+0

我得到的是匆忙打字。 :) – 2013-03-06 21:47:16

0

我不知道我理解你的問題。我知道它是:

「鑑於上述查詢,我​​如何更新包含最大生效時間與新值的行?」

假設issueid是你的主鍵,答案是這樣的:

update testtempgeneralinfo 
set 
    effectivetime = getdate() --columns and values will vary... 
where issueid = (
    SELECT top 1 testtempgeneralinfo.issueid 
    FROM 
    testtaskgeneralinfo 
    INNER JOIN 
    testtempgeneralinfo 
    ON testtaskgeneralinfo.testtemplateid = testtempgeneralinfo.issueid 
    WHERE testtempgeneralinfo.projectid = 150 
    order by 
     testtaskgeneralinfo.effectivetime desc 
);