Maison >développement back-end >C++ >Comment fusionner efficacement plusieurs tables de données avec des structures de colonnes variables dans SQL Server ?

Comment fusionner efficacement plusieurs tables de données avec des structures de colonnes variables dans SQL Server ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-27 19:10:11386parcourir

How to Efficiently Merge Multiple DataTables with Varying Column Structures in 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

  • Simplifie le processus de fusion en éliminant le besoin de boucles manuelles.
  • Permet la spécification facultative d'une clé primaire pour fusionner des lignes lorsque les colonnes diffèrent.
  • Combine et ajuste automatiquement les valeurs des données pour répéter la clé primaire lignes.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn