从其他表更新表 SQL

Posted

技术标签:

【中文标题】从其他表更新表 SQL【英文标题】:Update table SQL from other table 【发布时间】:2021-03-01 12:39:23 【问题描述】:

我有表格 - 'GroupData' 包含包含组和日期的数据,表格 - 'LastData' 包含每个组的最后日期 - 过去的最后更新。 我尝试编写查询,更新“LastData”,最后“LastData”将包含每组一行,并且 date = max(date)

结果 - 每组仅更改“LastData”一行。日期将是最大(日期) 它将在结果中,组 2 只有 1 个日期01-02-2021 和过去 -> 它将出现在结果中,而第 3 组不会出现在结果中,因为日期在未来

组数据

group date
1 01-01-2020
1 01-01-2021
1 01-01-2022
2 01-02-2021
3 01-02-2022

最后一个数据

group date
1 01-01-2020

结果

group date
1 01-01-2021
2 01-02-2021

【问题讨论】:

请说明您使用的是哪个 dbms。 Microsoft SQL Server 这里我们需要更多细节。例如,我不清楚为什么上述第 1 组的结果应该以 2021 结束,而不是第 2 组。在您的问题中,请澄清所需的结果。另外,请更新您的问题以包含您的 MSSQL 数据库的标签。然后,这个问题将被发送给更熟悉特定 RDBMS 的人,而不是(仅)知道 SQL 的人。 【参考方案1】:

由于您想在插入 lastdata 表之前删除匹配的行,您可以使用合并。当 lastdata 中有任何组可用时,此查询将检查 groupdata 中的组明智最大日期是否早于 lastdata 中的日期。如果较旧,则它将更新 lastdata 表,否则将不执行任何操作。

如果 groupdata 中有一个组可用但 lastdata 中没有,那么它将插入该行。

merge LastData ld
using(select [group],max(date) DATE from groupdata group by [group]) t ON T.[GROUP]=LD.[GROUP]
WHEN MATCHED AND T.DATE>LD.DATE THEN UPDATE SET LD.DATE=T.DATE
WHEN NOT MATCHED BY TARGET THEN INSERT ([GROUP],DATE)VALUES(T.[GROUP],T.DATE);

如果您想在 groupdata 中的 group 不可用时从 lastdata 中删除行,您可以在末尾添加 When Not Matched By Source 然后删除条件,如下所示:

merge LastData ld
    using(select [group],max(date) DATE from groupdata group by [group]) t ON T.[GROUP]=LD.[GROUP]
    WHEN MATCHED AND T.DATE>LD.DATE THEN UPDATE SET LD.DATE=T.DATE
    WHEN NOT MATCHED BY TARGET THEN INSERT ([GROUP],DATE)VALUES(T.[GROUP],T.DATE)
    WHEN NOT MATCHED BY SOURCE THEN DELETE;

【讨论】:

【参考方案2】:

一种方法是left join 和聚合:

select gd.group,
       coalesce(min(case when gd.date >= ld.date then gd.date end),
                min(gd.date)
               )
from groupData gd left join
     lastData ld
     on gd.group = ld.group        
group by gd.group;

【讨论】:

以上是关于从其他表更新表 SQL的主要内容,如果未能解决你的问题,请参考以下文章

用于从 N 记录的其他表值更新值的 SQL 查询

使用其他行的数据更新同一表中的行 SQL

如何从 select 进行 Oracle SQL 更新?

使用来自其他平面表的数据的 SQL 更新行

引用其他表的 SQL MS Access 条件更新查询

如何从其他表中更新表中的值