首頁 >後端開發 >C++ >如何在 SQL Server 中有效率地合併多個具有不同列結構的資料表?

如何在 SQL Server 中有效率地合併多個具有不同列結構的資料表?

Linda Hamilton
Linda Hamilton原創
2024-12-27 19:10:11386瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn