Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menggabungkan Berbilang Jadual Data dengan Cekap dengan Struktur Lajur yang Berbeza-beza dalam SQL Server?

Bagaimana untuk Menggabungkan Berbilang Jadual Data dengan Cekap dengan Struktur Lajur yang Berbeza-beza dalam SQL Server?

Linda Hamilton
Linda Hamiltonasal
2024-12-27 19:10:11385semak imbas

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

Menggabungkan Berbilang Jadual Data ke dalam Jadual Data Tunggal

Apabila bekerja dengan data dalam SQL Server, kadangkala perlu untuk menggabungkan data daripada berbilang jadual ke dalam set data tunggal dan bersatu. Ini boleh dicapai menggunakan operasi Gabung, yang membolehkan anda menambahkan baris daripada jadual berbeza ke dalam jadual sasaran. Walau bagaimanapun, jika jadual mempunyai struktur lajur yang berbeza, jadual cantuman yang terhasil mungkin mempunyai padding atau data yang tidak sejajar.

Penyelesaian dan Had Sedia Ada

Penyelesaian yang disediakan cuba menyelesaikannya isu dengan menggunakan gelung Gabung untuk menggabungkan Jadual Data daripada berbilang jadual yang tidak diketahui dengan struktur lajur yang berbeza-beza. Walaupun kaedah ini berfungsi, ia boleh membosankan dan boleh mengakibatkan salah jajaran data.

Pendekatan Alternatif Menggunakan LINQ

Untuk mengatasi batasan ini, pendekatan alternatif menggunakan LINQ (Bahasa Pertanyaan Bersepadu) ialah tersedia:

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;
}

Penggunaan

Untuk menggunakan kaedah MergeAll, lulus senarai Jadual Data dan secara pilihan tentukan nama lajur kunci utama biasa:

var tables = new[] { tblA, tblB, tblC };
DataTable TblUnion = tables.MergeAll("c1");

Kelebihan LINQ Pendekatan

  • Memudahkan proses penggabungan dengan menghapuskan keperluan untuk gelung manual.
  • Membenarkan spesifikasi pilihan kunci utama untuk menggabungkan baris apabila lajur berbeza.
  • Menggabungkan dan melaraskan nilai data secara automatik untuk mengulang kunci utama baris.

Nota: Penyelesaian ini memerlukan semua jadual mempunyai nama lajur unik untuk kunci utama, jika dinyatakan.

Atas ialah kandungan terperinci Bagaimana untuk Menggabungkan Berbilang Jadual Data dengan Cekap dengan Struktur Lajur yang Berbeza-beza dalam SQL Server?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn