Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menggabungkan Berbilang Baris Subquery ke dalam Medan Terhad Tunggal dalam Pelayan SQL?
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!