Maison >développement back-end >C++ >Comment fusionner efficacement plusieurs tables de données avec des structures de colonnes variables dans SQL Server ?
Combinaison de plusieurs DataTables en un seul DataTable
Lorsque vous travaillez avec des données dans SQL Server, il est parfois nécessaire de combiner les données de plusieurs tables en un seul. ensemble de données unique et unifié. Ceci peut être réalisé à l'aide d'opérations de fusion, qui vous permettent d'ajouter des lignes de différentes tables dans une table cible. Cependant, si les tables ont des structures de colonnes différentes, la table fusionnée résultante peut avoir un remplissage ou des données mal alignées.
Solution existante et limitations
La solution fournie tente de résoudre ce problème. problème en utilisant une boucle de fusion pour combiner des DataTables de plusieurs tables inconnues avec différentes structures de colonnes. Bien que cette méthode fonctionne, elle peut être fastidieuse et entraîner un désalignement des données.
Approche alternative utilisant LINQ
Pour surmonter ces limitations, une approche alternative utilisant LINQ (Language Requête intégrée) est disponible :
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; }
Utilisation
Pour utiliser la méthode MergeAll, transmettez une liste de DataTables et spécifiez éventuellement un nom de colonne de clé primaire commune :
var tables = new[] { tblA, tblB, tblC }; DataTable TblUnion = tables.MergeAll("c1");
Avantages de LINQ Approche
Remarque : Cette solution nécessite que toutes les tables aient un nom de colonne unique pour la clé primaire, si spécifié.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!