[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.그것을 설명하는 가장 간단한 방법은 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.단계별로 그것을 분해 - 안에서부터 밖으로.
단계별로 그것을 분해 - 안에서부터 밖으로.
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.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.외부 쿼리는 부서 번호 목록을 검색하고 각 부서 번호가 해당 부서에 속한 모든 이름을 반환하는 서브 쿼리는 실행됩니다. 하위 쿼리는 FOR의 XML의 한 줄의 쉼표로 출력 서식을 문 구분 된 목록을 사용합니다.
외부 쿼리는 부서 번호 목록을 검색하고 각 부서 번호가 해당 부서에 속한 모든 이름을 반환하는 서브 쿼리는 실행됩니다. 하위 쿼리는 FOR의 XML의 한 줄의 쉼표로 출력 서식을 문 구분 된 목록을 사용합니다.
from https://stackoverflow.com/questions/10381512/what-this-query-does-to-create-comma-delimited-list-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 왼쪽은 SQL Server의 성능을 가입 대 INNER는 가입 (0) | 2020.03.13 |
---|---|
[SQL] 어떻게 SQL Server의 테이블에서 열 이름을 얻을 수 있나요? (0) | 2020.03.13 |
[SQL] 어떻게 MySQL은 여러 테이블에서 삭제하려면? (0) | 2020.03.13 |
[SQL] 어떻게 두 숫자 사이의 숫자의 범위를 생성하는? (0) | 2020.03.13 |
[SQL] SQL 서버 - 저장 프로 시저에서 SELECT (0) | 2020.03.13 |