从其他表更新表 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的主要内容,如果未能解决你的问题,请参考以下文章