> 데이터 베이스 > MySQL 튜토리얼 > SQL Server에서 여러 하위 쿼리 행을 단일 구분 필드로 결합하려면 어떻게 해야 합니까?

SQL Server에서 여러 하위 쿼리 행을 단일 구분 필드로 결합하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2025-01-22 00:19:16
원래의
578명이 탐색했습니다.

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

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿