首页 > 后端开发 > C++ > 如何在 SQL Server 中高效地合并多个具有不同列结构的数据表?

如何在 SQL Server 中高效地合并多个具有不同列结构的数据表?

Linda Hamilton
发布: 2024-12-27 19:10:11
原创
402 人浏览过

How to Efficiently Merge Multiple DataTables with Varying Column Structures in SQL Server?

将多个数据表合并为一个数据表

在 SQL Server 中处理数据时,有时需要将多个表中的数据合并为一个数据表单一、统一的数据集。这可以使用合并操作来实现,该操作允许您将不同表中的行追加到目标表中。但是,如果表具有不同的列结构,则生成的合并表可能会有填充或未对齐的数据。

现有解决方案和限制

提供的解决方案尝试解决此问题通过使用 Merge 循环将来自多个具有不同列结构的未知表的 DataTable 组合起来来解决此问题。虽然此方法有效,但它可能很乏味,并且可能会导致数据不一致。

使用 LINQ 的替代方法

为了克服这些限制,可以使用使用 LINQ(语言)的替代方法综合查询)是可用:

public static DataTable MergeAll(this IList<DataTable> tables, String primaryKeyColumn)
{
    if (!tables.Any())
        throw new ArgumentException("Tables must not be empty", "tables");
    if(primaryKeyColumn != null)
        foreach(DataTable t in tables)
            if(!t.Columns.Contains(primaryKeyColumn))
                throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn");

    if(tables.Count == 1)
        return tables[0];

    DataTable table = new DataTable("TblUnion");
    table.BeginLoadData(); // Turns off notifications, index maintenance, and constraints while loading data
    foreach (DataTable t in tables)
    {
        table.Merge(t); // same as table.Merge(t, false, MissingSchemaAction.Add);
    }
    table.EndLoadData();

    if (primaryKeyColumn != null)
    {
        // since we might have no real primary keys defined, the rows now might have repeating fields
        // so now we're going to "join" these rows ...
        var pkGroups = table.AsEnumerable()
            .GroupBy(r => r[primaryKeyColumn]);
        var dupGroups = pkGroups.Where(g => g.Count() > 1);
        foreach (var grpDup in dupGroups)
        { 
            // use first row and modify it
            DataRow firstRow = grpDup.First();
            foreach (DataColumn c in table.Columns)
            {
                if (firstRow.IsNull(c))
                {
                    DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c));
                    if (firstNotNullRow != null)
                        firstRow[c] = firstNotNullRow[c];
                }
            }
            // remove all but first row
            var rowsToRemove = grpDup.Skip(1);
            foreach(DataRow rowToRemove in rowsToRemove)
                table.Rows.Remove(rowToRemove);
        }
    }

    return table;
}
登录后复制

用法

要使用 MergeAll 方法,请传递 DataTable 列表并可选择指定公共主键列名称:

var tables = new[] { tblA, tblB, tblC };
DataTable TblUnion = tables.MergeAll("c1");
登录后复制

LINQ 的优点方法

  • 通过消除手动循环的需要来简化合并过程。
  • 允许在列不同时主键的可选规范来合并行。
  • 自动组合和调整重复主键的数据值rows.

注意:此解决方案要求所有表都具有唯一的主键列名称(如果指定)。

以上是如何在 SQL Server 中高效地合并多个具有不同列结构的数据表?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板