복붙노트

[SQL] 이 쿼리는 쉼표로 구분 된 목록의 SQL 서버를 만들기 위해 무엇을?

SQL

이 쿼리는 쉼표로 구분 된 목록의 SQL 서버를 만들기 위해 무엇을?

나는 테이블에서 구분 된 목록을 작성하는 구글의 도움으로이 쿼리를 작성했습니다하지만 난이 쿼리에서 아무것도 이해하지 않았다.

사람이 무슨 일이 일어나고 있는지 나를 설명 할 수

 SELECT 
    E1.deptno, 
    allemp = Replace ((SELECT E2.ename AS 'data()' 
                       FROM emp AS e2 
                       WHERE e1.deptno = e2.DEPTNO 
                       FOR xml PATH('')), ' ', ', ') 
 FROM EMP AS e1 
 GROUP BY DEPTNO; 

날이 발생할 수 있습니다

10  CLARK, KING, MILLER
20  SMITH, JONES, SCOTT, ADAMS, FORD
30  ALLEN, WARD, MARTIN, BLAKE, TURNER, JAMES

해결법

  1. ==============================

    1.그것을 설명하는 가장 간단한 방법은 XML 경로에 대한 실제 XML에 대해 어떻게 작동하는지 살펴 보는 것입니다. 간단한 테이블의 직원을 상상해 :

    그것을 설명하는 가장 간단한 방법은 XML 경로에 대한 실제 XML에 대해 어떻게 작동하는지 살펴 보는 것입니다. 간단한 테이블의 직원을 상상해 :

    EmployeeID      Name
    1               John Smith
    2               Jane Doe
    

    당신은 사용할 수 있습니다

    SELECT  EmployeeID, Name
    FROM    emp.Employee
    FOR XML PATH ('Employee')
    

    이것은 다음과 같이 XML을 만들 것

    <Employee>
        <EmployeeID>1</EmployeeID>
        <Name>John Smith</Name>
    </Employee>
    <Employee>
        <EmployeeID>2</EmployeeID>
        <Name>Jane Doe</Name>
    </Employee>
    

    PATH에서 '직원'을 제거하면이 쿼리 때문에 외부 XML 태그를 제거합니다 :

    SELECT  Name
    FROM    Employee
    FOR XML PATH ('')
    

    만들겠습니까

        <Name>John Smith</Name>
        <Name>Jane Doe</Name>
    

    당신이 다음 일을하는 것은 적합하지 않습니다, 열 이름의 데이터 () '의 힘 다음과 같은 오류가 발생 그래서, 법적 태그가 아닌 XML 태그를 만들려고하기 때문에 SQL 오류 :

    상관 하위 쿼리는이 오류를 숨기고 단지 어떤 태그와 XML을 생성합니다 :

    SELECT  Name AS [Data()]
    FROM    Employee
    FOR XML PATH ('')
    

    생성

    John Smith Jane Doe
    

    그런 다음 쉼표와 공백을 대체하고, 상당히 자기는 설명을 ...

    내가 당신이라면 나는 쿼리를 약간 적응 것이다 :

    SELECT  E1.deptno, 
            STUFF(( SELECT  ', ' + E2.ename 
                    FROM    emp AS e2 
                    WHERE   e1.deptno = e2.DEPTNO 
                    FOR XML PATH('')
                ), 1, 2, '') 
    FROM    EMP AS e1 
    GROUP BY DEPTNO; 
    

    더 열 별칭 태그가 생성에는 XML을 의미하지 않습니다 갖는, 그리고에서 선택 쿼리의 범위 내에서 공백이있는 모든 이름을 쉼표를 추가하면 오류 원인 물건은 첫 번째 쉼표과 공간을 제거하지 않습니다.

    추가

    이 몇 가지 더 의견을 받고있는 것으로 보인다, KM 코멘트에서 말씀하신 것을에 자세히 설명하기 위해 XML 문자를 탈출하는 올바른 방법은 다음과 같이 .value을 사용하는 것입니다 :

    SELECT  E1.deptno, 
            STUFF(( SELECT  ', ' + E2.ename 
                    FROM    emp AS e2 
                    WHERE   e1.deptno = e2.DEPTNO 
                    FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 
    FROM    EMP AS e1 
    GROUP BY DEPTNO; 
    
  2. ==============================

    2.단계별로 그것을 분해 - 안에서부터 밖으로.

    단계별로 그것을 분해 - 안에서부터 밖으로.

    1 단계:

    가장 안쪽의 쿼리를 실행하고 생성하는 것을 볼 수 :

    SELECT E2.ename AS 'data()' 
    FROM emp AS e2 
    WHERE e2.DEPTNO = 10
    FOR XML PATH('')
    

    당신은 같은 출력 무언가를 얻어야한다 :

    CLARK KING MILLER
    

    2 단계:

    따라서로 출력을 전환 - 단지와 공백을 대체 교체

    CLARK, KING, MILLER
    

    3 단계 :

    플러스 내부 쿼리의 결과 - - 외부 쿼리는 DEPTNO 값을 얻고 최종 결과를 생성합니다.

  3. ==============================

    3.SQL 서버 2017는 새로운 STRING_AGG이 훨씬 쉬워집니다. 최근이 게시물을 가로 질러 와서 새 문자열 기능을 사용하려면 내 물건 / FOR XML 전략을 전환했다. 또한 추가 할 필요가 가입 / SUBQUERYand XML에 대한 오버 헤드 (및 문제를 인코딩여)하고 해석하기 어려운 SQL을 피할 수 있습니다.

    SQL 서버 2017는 새로운 STRING_AGG이 훨씬 쉬워집니다. 최근이 게시물을 가로 질러 와서 새 문자열 기능을 사용하려면 내 물건 / FOR XML 전략을 전환했다. 또한 추가 할 필요가 가입 / SUBQUERYand XML에 대한 오버 헤드 (및 문제를 인코딩여)하고 해석하기 어려운 SQL을 피할 수 있습니다.

    SELECT  E1.deptno, 
            STRING_AGG(E1.ename, ', ') AS allemp
    FROM    EMP AS e1 
    GROUP BY DEPTNO; 
    

    참고 : 또한 훨씬 더 쉽게 데이터를 구분 SQL 작업을하기 위해 상대 STRING_SPLIT을 확인하십시오.

  4. ==============================

    4.외부 쿼리는 부서 번호 목록을 검색하고 각 부서 번호가 해당 부서에 속한 모든 이름을 반환하는 서브 쿼리는 실행됩니다. 하위 쿼리는 FOR의 XML의 한 줄의 쉼표로 출력 서식을 문 구분 된 목록을 사용합니다.

    외부 쿼리는 부서 번호 목록을 검색하고 각 부서 번호가 해당 부서에 속한 모든 이름을 반환하는 서브 쿼리는 실행됩니다. 하위 쿼리는 FOR의 XML의 한 줄의 쉼표로 출력 서식을 문 구분 된 목록을 사용합니다.

  5. from https://stackoverflow.com/questions/10381512/what-this-query-does-to-create-comma-delimited-list-sql-server by cc-by-sa and MIT license