Kaedah penyatuan rentetan SQL Server
Penerangan masalah:
Anda perlu mengagregatkan rentetan daripada berbilang baris ke dalam satu baris. COALESCE dan FOR XML tidak akan melakukan apa yang anda perlukan dan Azure tidak menyokong fungsi agregat yang ditakrifkan CLR. Anda perlu mencari alternatif terbaik.
Penyelesaian:
Menggunakan Transact SQL standard, anda boleh menggabungkan rentetan dengan cekap dengan mengikut langkah berikut:
Arahan:
Kaedah ini menggunakan tiga CTE:
Untuk menggunakan penyelesaian ini, anda mesti menentukan kriteria pengumpulan dan pengisihan. Contohnya, dalam kes anda, baris dengan ID yang sama disatukan dan diisih mengikut abjad.
Contoh:
Pertimbangkan data berikut:
<code>ID Name -- -- 1 Matt 1 Rocks 2 Stylus 3 Foo 3 Bar 3 Baz</code>
Pertanyaan dan outputnya adalah seperti berikut:
<code class="language-sql">WITH Partitioned AS ( SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber, COUNT(*) OVER (PARTITION BY ID) AS NameCount FROM dbo.SourceTable ), Concatenated AS ( SELECT ID, CAST(Name AS nvarchar(max)) AS FullName, Name, NameNumber, NameCount FROM Partitioned WHERE NameNumber = 1 UNION ALL SELECT P.ID, CAST(C.FullName + ', ' + P.Name AS nvarchar(max)), P.Name, P.NameNumber, P.NameCount FROM Partitioned AS P INNER JOIN Concatenated AS C ON P.ID = C.ID AND P.NameNumber = C.NameNumber + 1 ) SELECT ID, FullName FROM Concatenated WHERE NameNumber = NameCount;</code>
<code>ID FullName -- ------------------------------ 2 Stylus 3 Bar, Baz, Foo 1 Matt, Rocks</code>
Perihalan penambahbaikan: Tukar jenis nvarchar
kepada nvarchar(max)
untuk menyokong hasil penggabungan rentetan yang lebih panjang. Ini mengelakkan kemungkinan ralat limpahan panjang rentetan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan Rentetan dengan Cekap daripada Berbilang Baris dalam Pelayan SQL Tanpa Menggunakan Fungsi FOR XML atau CLR?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!