2013-01-21 30 views
2

我想更新連接到另一個表的表中的一些行。左表按ID編索引;右表加入相同的ID,但每個ID有多行。我的查詢如下所示:基於連接多行的更新表SQL Server

UPDATE t1 
SET t1.modified = t2.created 
FROM table1 t1 
     INNER JOIN table2 t2 
      ON t1.ID = t2.ID 

請注意,t1.modified和t2.created都是日期時間。 如前所述,t2每個ID有幾行,每個都有一個不同的創建值(所以主鍵是t2,創建)。我想要做的是設置t2.created = t1.modified的最大值。但是,在加入時,t1.modified值將不會按特定順序更新,因此無論哪一行最後更新,都是t1.modified獲取的值。我嘗試使用t1.modified = max(t2.created),但顯然我不能在更新查詢中使用聚合函數,也不能使用訂單子句(即排序行,以便最後一行更新將實際上是更新查詢中的最新值t2.created)。

任何幫助你可以提供我非常感謝!謝謝!!

回答

1

這個怎麼樣?這會適合你的需要嗎?

UPDATE t1 
    SET modified = isnull((SELECT max(t2.created) 
          FROM table2 t2 
          WHERE t2.ID = t1.ID), modified) 
    FROM table1 t1; 

如果返回值爲null,則使用isnull函數將修改設置爲自身。應該照顧無效問題。

+0

我遇到了一個問題,它說修改的列不允許空值(所以更新失敗)。我猜這是因爲不是每個t1.ID都在t2?有什麼建議麼?我試圖追加不在...的地方,哪裏不存在 - 都沒有成功。 – user1422348

+0

這個......編輯如上,我添加了issnull選項。 –

+0

謝謝!像魅力一樣工作。 – user1422348

-1

你可以這樣做,雖然它可能不是標準的SQL。但它應該適用於SQL Server。

update t1 
    set t1.modified = (select max([created]) from t2 where t1.ID = t2.id)