【问题标题】:Update table based on join multiple rows SQL Server基于连接多行SQL Server更新表
【发布时间】:2013-01-21 03:26:11
【问题描述】:

我正在尝试更新连接到另一个表的表中的某些行。左表按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 都是日期时间。 如前所述,t2 每个 ID 有几行,每行都有不同的 created 值(因此主键是 t2,created)。我想要做的是设置 t2.created=t1.modified 的最大值。但是,在加入时, t1.modified 的值不会以特定顺序更新,因此无论哪一行最后更新,这就是 t1.modified 获得的值。我尝试使用 t1.modified=max(t2.created),但显然我不能在更新查询中使用聚合函数,也不能使用 order 子句(即对行进行排序,以便更新的最后一行有效地成为更新查询中 t2.created 的最新值。

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

【问题讨论】:

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


    【解决方案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 设置为自身。这应该可以解决 null 问题。

    【讨论】:

    • 我遇到了一个问题,即修改后的列不允许空值(因此更新失败)。我猜这是因为不是每个 t1.ID 都在 t2 中?有什么建议么?我试图在不存在的地方追加......以及不存在的地方 - 都没有用。
    • 谢谢!像魅力一样工作。
    【解决方案2】:

    您可以这样做,尽管它可能不是标准 SQL。但是它应该适用于 SQL Server。

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

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2023-01-12
      • 2021-08-06
      • 1970-01-01
      • 2019-03-27
      相关资源
      最近更新 更多