Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menggabungkan Berbilang Baris Subquery ke dalam Medan Terhad Tunggal dalam Pelayan SQL?

Bagaimanakah Saya Boleh Menggabungkan Berbilang Baris Subquery ke dalam Medan Terhad Tunggal dalam Pelayan SQL?

Barbara Streisand
Barbara Streisandasal
2025-01-22 00:19:16618semak imbas

How Can I Combine Multiple Subquery Rows into a Single Delimited Field in SQL Server?

SQL Server: Menggabungkan Berbilang Baris Subkueri ke dalam Medan Terhad Tunggal

Artikel ini meneroka beberapa kaedah untuk menyatukan baris daripada subkueri ke dalam medan terhad tunggal dalam SQL Server. Kami akan memeriksa teknik yang sesuai untuk versi SQL Server yang berbeza.

Kaedah 1: UNTUK LALUAN XML (SQL Server 2005 dan lebih baru)

Pendekatan klasik ini menggunakan FOR XML PATH untuk menggabungkan hasil dengan cekap:

<code class="language-sql">SELECT 
    [VehicleID],
    [Name],
    STUFF((SELECT ', ' + [City]
           FROM [Location]
           WHERE (VehicleID = Vehicle.VehicleID)
           FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS Locations
FROM [Vehicle]</code>

Kaedah 2: STRING_AGG (SQL Server 2017 dan lebih baru)

Untuk versi SQL Server yang lebih baharu, STRING_AGG menyediakan penyelesaian yang lebih mudah dibaca dan selalunya lebih pantas:

<code class="language-sql">SELECT  
    [VehicleID],
    [Name],
    STRING_AGG([City], ', ') AS Locations
FROM   
    [Vehicle] V
JOIN
    [Location] L ON V.VehicleID = L.VehicleID
GROUP BY
    [VehicleID], [Name]</code>

Perhatikan penggunaan JOIN di sini untuk prestasi yang lebih baik berbanding dengan subkueri dalam kes khusus ini.

Kaedah 3: Fungsi Tersuai (Semua Versi Pelayan SQL)

Untuk kebolehgunaan semula maksimum merentas versi dan senario SQL Server yang berbeza, fungsi tersuai menawarkan fleksibiliti:

<code class="language-sql">CREATE FUNCTION dbo.JoinRows (@Subquery NVARCHAR(MAX), @Delimiter NVARCHAR(1))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @Result NVARCHAR(MAX) = '';
    DECLARE @Row NVARCHAR(MAX);
    DECLARE @NextRow CURSOR;

    SET @NextRow = CURSOR FOR SELECT [Value] FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', @Subquery);

    OPEN @NextRow;
    FETCH NEXT FROM @NextRow INTO @Row;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @Result += @Row + @Delimiter;
        FETCH NEXT FROM @NextRow INTO @Row;
    END;

    CLOSE @NextRow;
    DEALLOCATE @NextRow;

    RETURN STUFF(@Result, LEN(@Result), LEN(@Delimiter), ''); -- Remove trailing delimiter
END;
GO</code>

Fungsi ini menggunakan OPENROWSET untuk melaksanakan subkueri dinamik. Ini lebih selamat daripada melaksanakan SQL dinamik secara langsung. Fungsi itu kemudiannya boleh digunakan seperti ini:

<code class="language-sql">SELECT 
    VehicleID, 
    Name, 
    dbo.JoinRows((SELECT City FROM Location WHERE VehicleID = Vehicle.VehicleID), ',') AS Locations
FROM Vehicle;</code>

Pilih kaedah yang paling sesuai dengan versi SQL Server dan keperluan prestasi anda. Untuk SQL Server 2017 dan lebih baru, STRING_AGG biasanya disyorkan untuk kesederhanaan dan prestasinya. Untuk versi lama, atau untuk senario yang lebih kompleks, fungsi tersuai menyediakan penyelesaian yang mantap dan boleh digunakan semula.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan Berbilang Baris Subquery ke dalam Medan Terhad Tunggal dalam Pelayan SQL?. 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