You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL多表合并至单一视图:获取最新时间戳记录最优方案咨询

嘿,这个需求我刚好有过类似的处理经验,给你几个不同场景下的最优方案参考:

优先推荐:数据库端用窗口函数实现

这个方案是效率最高的,因为直接在数据源头做过滤,不用把大量冗余数据拉到应用层处理,尤其适合50多张表的批量场景。

单表筛选逻辑

对每张表,用窗口函数ROW_NUMBER()按ObjNr分组,按timestamp降序排序,只保留每组的第一条(也就是最新记录):

SELECT *
FROM (
    SELECT 
        ObjNr,
        Column1, Column2, -- 替换成你的实际业务列
        timestamp,
        ROW_NUMBER() OVER (PARTITION BY ObjNr ORDER BY timestamp DESC) AS rn
    FROM YourTableName
) filtered
WHERE rn = 1

合并多表生成视图

把50多张表的上述查询用UNION ALL拼接起来,创建一个通用视图。如果表结构一致,还可以用动态SQL自动生成脚本,避免手动重复写50次(以SQL Server为例):

DECLARE @sql NVARCHAR(MAX) = ''

SELECT @sql += '
SELECT *
FROM (
    SELECT 
        ObjNr,
        Column1, Column2, timestamp,
        ROW_NUMBER() OVER (PARTITION BY ObjNr ORDER BY timestamp DESC) AS rn
    FROM ' + QUOTENAME(name) + '
) t WHERE rn = 1
UNION ALL '
FROM sys.tables
WHERE name LIKE '你的表名前缀%' -- 筛选出需要处理的50多张表

-- 去掉最后一个多余的UNION ALL
SET @sql = LEFT(@sql, LEN(@sql) - 10)

-- 创建视图
EXEC sp_executesql N'CREATE VIEW vw_LatestObjRecords AS ' + @sql

备选:ETL工具处理(适合复杂转换场景)

如果需要对数据做更多后续加工(比如字段映射、数据清洗),用ETL工具(比如SSIS、Apache Airflow、Fivetran)会更灵活:

  • 用循环组件遍历所有目标数据表。
  • 对每张表,先按ObjNr分组找到最大timestamp,再关联原表取出整条记录;或者直接复用窗口函数筛选逻辑。
  • 把所有表的结果合并后,写入目标表或生成视图。
    优点是可视化配置,自带日志、错误重试机制,适合非纯SQL的复杂场景。

优化你的C#实现(如果必须用应用层处理)

如果之前的C#方案效率偏低,可以从这几点优化:

  • 不要全表拉取:在C#里执行带窗口函数的SQL,只从数据库取每张表的最新记录,减少内存占用和网络传输量。
  • 并行查询:用Task.WhenAll同时发起多个表的查询请求,提升批量处理速度。
  • 高效去重合并:用Dictionary<string, YourModel>(以ObjNr为键)存储结果,遇到相同ObjNr时比较timestamp,只保留最新的那条记录。

关键注意点

  • 给每张表的ObjNr和timestamp字段加联合索引,能大幅提升窗口函数的执行速度,避免大表排序卡顿。
  • 如果表结构不一致,先通过逆透视把不同列转成键值对格式,统一结构后再按ObjNr和timestamp筛选。
  • 如果视图查询频繁,可以考虑用物化视图(或快照表)定期刷新,而不是每次查询都实时计算,提升查询性能。

内容的提问来源于stack exchange,提问作者murso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:55:22