Kombinieren mehrerer Datentabellen zu einer einzigen Datentabelle
Beim Arbeiten mit Daten in SQL Server ist es manchmal erforderlich, Daten aus mehreren Tabellen zu einer einzigen Datentabelle zu kombinieren einzelner, einheitlicher Datensatz. Dies kann mithilfe von Zusammenführungsoperationen erreicht werden, mit denen Sie Zeilen aus verschiedenen Tabellen an eine Zieltabelle anhängen können. Wenn die Tabellen jedoch unterschiedliche Spaltenstrukturen haben, kann die resultierende zusammengeführte Tabelle Auffüllungen oder falsch ausgerichtete Daten aufweisen.
Vorhandene Lösung und Einschränkungen
Die bereitgestellte Lösung versucht, dieses Problem zu lösen Problem durch die Verwendung einer Merge-Schleife, um Datentabellen aus mehreren unbekannten Tabellen mit unterschiedlichen Spaltenstrukturen zu kombinieren. Obwohl diese Methode funktioniert, kann sie mühsam sein und zu einer Fehlausrichtung der Daten führen.
Alternativer Ansatz mit LINQ
Um diese Einschränkungen zu überwinden, ist ein alternativer Ansatz mit LINQ (Language Integrierte Abfrage) ist verfügbar:
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; }
Verwendung
Um die MergeAll-Methode zu verwenden, übergeben Sie eine Liste von DataTables und geben Sie optional einen gemeinsamen Primärschlüsselspaltennamen an:
var tables = new[] { tblA, tblB, tblC }; DataTable TblUnion = tables.MergeAll("c1");
Vorteile von LINQ Ansatz
Hinweis: Diese Lösung erfordert, dass alle Tabellen einen eindeutigen Spaltennamen für den Primärschlüssel haben, falls angegeben.
Das obige ist der detaillierte Inhalt vonWie lassen sich mehrere Datentabellen mit unterschiedlichen Spaltenstrukturen in SQL Server effizient zusammenführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!