基于连接多行SQL Server更新表

时间:2013-01-21 03:26:11

标签: sql-server sql-update inner-join

我正在尝试更新连接到另一个表的表中的某些行。左表由ID索引;右表连接在同一个ID上,但每个ID有多行。我的查询如下:

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

请注意,t1.modified和t2.created都是datetime。 如上所述,t2每个ID有几行,每个行具有不同的创建值(因此主键是t2,创建)。我想要做的是设置t2.created = t1.modified的最大值。但是,在加入时,t1.modified值不会按特定顺序更新,因此无论最后一行更新哪一行,都是t1.modified获取的值。我尝试使用t1.modified = max(t2.created),但显然我不能在更新查询中使用聚合函数,也不能使用order子句(即对行进行排序,以便更新的最后一行实际上是更新查询中的最新t2.created值。

非常感谢您提供给我的任何帮助!谢谢!

2 个答案:

答案 0 :(得分:1)

这是怎么回事?这符合您的需求吗?

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

如果返回的值为null,则使用isnull函数将modified设置为self。应该处理空问题。

答案 1 :(得分:-1)

你可以这样做,虽然它可能不是标准的SQL。但它应该适用于SQL Server。

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