Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menggabungkan Berbilang Jadual Data dengan Cekap dengan Struktur Lajur yang Berbeza-beza dalam 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
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!