SQL Server: 여러 하위 쿼리 행을 단일 구분 필드로 결합
이 문서에서는 SQL Server 내에서 하위 쿼리의 행을 구분된 단일 필드로 연결하는 여러 가지 방법을 살펴봅니다. 다양한 SQL Server 버전에 적합한 기술을 살펴보겠습니다.
방법 1: FOR XML PATH(SQL Server 2005 이상)
이 고전적인 접근 방식은 FOR XML PATH
을 사용하여 결과를 효율적으로 연결합니다.
<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>
방법 2: STRING_AGG(SQL Server 2017 이상)
최신 SQL Server 버전의 경우 STRING_AGG
가 더 읽기 쉽고 더 빠른 솔루션을 제공합니다.
<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>
여기서 JOIN
를 사용하면 이 특정한 경우 하위 쿼리에 비해 성능이 향상됩니다.
방법 3: 사용자 정의 함수(모든 SQL Server 버전)
다양한 SQL Server 버전과 시나리오에서 재사용성을 극대화하기 위해 사용자 지정 기능이 유연성을 제공합니다.
<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>
이 함수는 OPENROWSET
을 사용하여 동적 하위 쿼리를 실행합니다. 이는 동적 SQL을 직접 실행하는 것보다 안전합니다. 그런 다음 이 기능을 다음과 같이 사용할 수 있습니다.
<code class="language-sql">SELECT VehicleID, Name, dbo.JoinRows((SELECT City FROM Location WHERE VehicleID = Vehicle.VehicleID), ',') AS Locations FROM Vehicle;</code>
SQL Server 버전 및 성능 요구 사항에 가장 적합한 방법을 선택하세요. SQL Server 2017 이상의 경우 STRING_AGG
는 일반적으로 단순성과 성능 때문에 권장됩니다. 이전 버전이나 더 복잡한 시나리오의 경우 사용자 정의 기능이 강력하고 재사용 가능한 솔루션을 제공합니다.
위 내용은 SQL Server에서 여러 하위 쿼리 행을 단일 구분 필드로 결합하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!