ホームページ >バックエンド開発 >C++ >SQL Server でさまざまな列構造を持つ複数の DataTable を効率的にマージする方法

SQL Server でさまざまな列構造を持つ複数の DataTable を効率的にマージする方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-27 19:10:11431ブラウズ

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

複数の DataTable を 1 つの DataTable に結合する

SQL Server でデータを操作する場合、複数のテーブルのデータを 1 つの DataTable に結合する必要がある場合があります。単一の統合されたデータセット。これは、マージ操作を使用して実現できます。これにより、異なるテーブルの行をターゲット テーブルに追加できます。ただし、テーブルの列構造が異なる場合、マージされたテーブルにはパディングまたは位置がずれたデータが含まれる可能性があります。

既存のソリューションと制限

提供されるソリューションは、これを解決しようとします。この問題は、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 でさまざまな列構造を持つ複数の DataTable を効率的にマージする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。