2013-08-27 93 views
0

我有以下表格:僅更新標識的日期最新的SQL(6 2)

Table 1

和:

Table 2

我制定此查詢:

Update Table 1 
SET DY_H_ID = ( 

    SELECT MAX(ID) 
    FROM Table 2 
    WHERE H_DateTime <= DY_Date 
    AND H_IDX = DY_IDX 
    AND H_HA_ID = 7 
    AND H_HSA_ID = 19 
    AND H_Description LIKE 'Diary item added for :%' 

) 
WHERE DY_H_ID IS NULL AND DY_IDX IS NOT NULL 

其中產品:

Table 1 after Update

然而,這個查詢更新所有6行。我只需要更新最新日期的兩行,即'2013-08-29 15:00:00.000'。這意味着6條記錄中只有2條會被更新,其他4條會保持爲NULL。

如何通過添加上述查詢來做到這一點?我知道這可能不太理想,但沒有選擇,只能做這樣的事情。我不明白的是,你如何只選擇最新的日期而不對其進行硬編碼。這些數據可以改變,它不會永遠是同一日期等

+0

您使用的是什麼版本的'sql-server'? –

+0

我正在使用SQL Server 2012. – frans

回答

1

試試這個:

UPDATE TABLE 1 
SET DY_H_ID = (SELECT Max(ID) 
        FROM TABLE 2 
        WHERE H_DATETIME <= DY_DATE 
         AND H_IDX = DY_IDX 
         AND H_HA_ID = 7 
         AND H_HSA_ID = 19 
         AND H_DESCRIPTION LIKE 'Diary item added for :%') 
WHERE DY_H_ID IS NULL 
     AND DY_IDX IS NOT NULL 
     AND DY_DATE = (SELECT Max(DY_DATE) 
         FROM TABLE1) 
+1

非常好,這個作品完美@Gidil。這就是爲什麼我是SQL noob,哈哈。認爲你是第一個,所以我會標記爲答案。 – frans

1

只需添加另一個條件的地方:

Update Table 1 
SET DY_H_ID = ( 

    SELECT MAX(ID) 
    FROM Table 2 
    WHERE H_DateTime <= DY_Date 
    AND H_IDX = DY_IDX 
    AND H_HA_ID = 7 
    AND H_HSA_ID = 19 
    AND H_Description LIKE 'Diary item added for :%' 

) 
WHERE DY_H_ID IS NULL AND DY_IDX IS NOT NULL 
and DY_Date = (select max(DY_Date) from Table 1) 
+0

很棒的@ksalk,謝謝。奇蹟般有效。 – frans

1

使用CTE,與SQL-Server-2005兼容或更高版本

;WITH cte AS (
    SELECT H_IDX, MAX(ID) MaxID 
    FROM Table2 
    WHERE H_HA_ID = 7 
      AND H_HSA_ID = 19 
      AND H_Description LIKE 'Diary item added for :%' 
    GROUP BY H_IDX 
) 
Update Table1 
SET DY_H_ID = MaxID 
FROM Table1 
INNER JOIN CTE ON cte.H_IDX = DY_IDX 
WHERE DY_H_ID IS NULL 
+0

如果我在WHERE子句中添加附加條件,這很好用。謝謝@Luis LL – frans

+0

我可以問一下@Luis LL,如果這個UPDATE語句運行了一下,比方說1 000 000條記錄,使用cte方法會有什麼性能改進嗎?這是比其他方法更好,更乾淨的方法嗎?或者你爲什麼從一開始就選擇cte? – frans

+1

不是必需的,在某些情況下效率會非常高,有很多情況下CTE的_pre-fetch_可以真正提高性能,在其他情況下它不會影響。還有第三種方法可以嘗試使用內部聯接('CTE查詢)「,它也可以執行得更好。有許多不同的因素,如索引,內存,統計數據,每個表中的行數等等,以給出絕對迴應。 –