複数の 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 の利点アプローチ
注: このソリューションでは、主キーが指定されている場合、すべてのテーブルに一意の列名があることが必要です。
以上がSQL Server でさまざまな列構造を持つ複数の DataTable を効率的にマージする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。