將多個資料表合併為一個資料表
在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 的優點方法
注意:此解決方案要求所有表都具有唯一的主鍵列名稱(如果指定)。
以上是如何在 SQL Server 中有效率地合併多個具有不同列結構的資料表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!