Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menggabungkan Rentetan Secara Optimum dalam SQL Azure Tanpa Fungsi Agregat CLR?

Bagaimanakah Saya Boleh Menggabungkan Rentetan Secara Optimum dalam SQL Azure Tanpa Fungsi Agregat CLR?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-20 09:16:10579semak imbas

How Can I Optimally Concatenate Strings in SQL Azure Without CLR Aggregate Functions?

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:

  1. Gunakan ROW_NUMBER() dan PARTITION BY untuk menomborkan baris dalam partition dan tentukan susunan gabungan.
  2. Gunakan CTE rekursif (Bercantum) secara berulang untuk membina rentetan bercantum.
  3. Tapis keputusan untuk memasukkan hanya hasil agregat akhir (di mana NameNumber = NameCount).

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

  • Untuk SQL Azure
  • Agak cekap, terutamanya untuk set data yang lebih kecil
  • Mudah untuk disesuaikan untuk senario sambungan tertentu (cth. susunan isihan, pemisah)

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!

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