Penyelesaian sambungan cekap rentetan SQL Azure
Dalam SQL Azure, mengagregat data rentetan berbeza ke dalam satu entiti dengan cekap adalah penting. Disebabkan kekurangan fungsi agregat tersuai CLR dalam SQL Azure, alternatif yang cekap perlu dicari.
Transact SQL Solution
Cara yang cekap ialah menggunakan WITH clause dan rekursif CTE (Common Table Expression). Kaedah ini termasuk:
Penerangan
Sila pertimbangkan pertanyaan 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>
Contoh
Untuk data berikut:
<code>ID Name ------- -------- 1 Matt 1 Rocks 2 Stylus 3 Foo 3 Bar 3 Baz</code>
Mengembalikan hasil agregat berikut:
<code>ID FullName ------- --------------------- 1 Matt, Rocks 2 Stylus 3 Foo, Bar, Baz</code>
Kelebihan
Nota: Untuk mengelakkan limpahan panjang jenis data nvarchar, tukar jenis CAST kepada nvarchar(maks). Selain itu, pengisihan dalam hasil contoh adalah sedikit berbeza daripada teks asal Ini kerana asas pengisihan ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) ialah medan Nama, mengakibatkan perbezaan dalam hasil pengisihan. Jika anda memerlukan kaedah pengisihan khusus, ubah suai klausa ORDER BY.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan Rentetan Secara Optimum dalam SQL Azure Tanpa Fungsi Agregat CLR?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!