Heim >Backend-Entwicklung >C++ >Wie lassen sich mehrere Datentabellen mit unterschiedlichen Spaltenstrukturen in SQL Server effizient zusammenführen?

Wie lassen sich mehrere Datentabellen mit unterschiedlichen Spaltenstrukturen in SQL Server effizient zusammenführen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-27 19:10:11386Durchsuche

How to Efficiently Merge Multiple DataTables with Varying Column Structures in SQL Server?

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

  • Vereinfacht den Zusammenführungsprozess, da keine manuellen Schleifen erforderlich sind.
  • Ermöglicht die optionale Angabe eines Primärschlüssels zum Zusammenführen von Zeilen, wenn sich Spalten unterscheiden.
  • Kombiniert und passt Datenwerte automatisch für sich wiederholende Primärschlüssel an Zeilen.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn