[SQL] 는 SQL 서버에서 어떻게 물건과 'XML 경로에 대한'작업
SQL는 SQL 서버에서 어떻게 물건과 'XML 경로에 대한'작업
표는 다음과 같습니다
+----+------+
| Id | Name |
+----+------+
| 1 | aaa |
| 1 | bbb |
| 1 | ccc |
| 1 | ddd |
| 1 | eee |
+----+------+
필수 출력 :
+----+---------------------+
| Id | abc |
+----+---------------------+
| 1 | aaa,bbb,ccc,ddd,eee |
+----+---------------------+
질문:
SELECT ID,
abc = STUFF(
(SELECT ',' + name FROM temp1 FOR XML PATH ('')), 1, 1, ''
)
FROM temp1 GROUP BY id
이 쿼리는 제대로 작동합니다. 하지만 난 그냥 작동 또는이 작업을 수행하는 다른 나 짧은 방법이 어떻게 설명을해야합니다.
나는 정말이를 이해하는 데 혼란을 얻고있다.
해결법
-
==============================
1.여기 그것이 작동하는 방법이다 :
여기 그것이 작동하는 방법이다 :
FOR XML을 1. 가져 오기 XML 요소 문자열
쿼리의 끝에 XML 경로 추가하면 PATH 인수에 포함 된 요소 이름, 출력 XML 요소로 쿼리의 결과로 수 있습니다. 우리가 있었던 예를 들어, 다음 문을 실행합니다 :
SELECT ',' + name FROM temp1 FOR XML PATH ('')
(( '') XML 경로) 빈 문자열을 전달함으로써, 우리는 대신 다음을 얻을 :
,aaa,bbb,ccc,ddd,eee
물건 쉼표를 선도 2. 제거
물건 문 첫 번째 문자열 내에서 문자를 대체하는 또 다른에 문자로 "물건"하나의 문자열. 우리는, 그러나, 단순히 값의 결과 목록의 첫 번째 문자를 제거하는 데 사용하고 있습니다.
SELECT abc = STUFF(( SELECT ',' + NAME FROM temp1 FOR XML PATH('') ), 1, 1, '') FROM temp1
(STUFF)의 매개 변수는 다음과 같습니다
우리와 끝까지 그래서 :
aaa,bbb,ccc,ddd,eee
전체 목록을 가져 ID에 가입합니다
우리가 임시 테이블에 ID의 목록이 가입 다음으로, 이름 ID 목록을 얻을 수 있습니다 :
SELECT ID, abc = STUFF( (SELECT ',' + name FROM temp1 t1 WHERE t1.id = t2.id FOR XML PATH ('')) , 1, 1, '') from temp1 t2 group by id;
그리고 우리는 우리의 결과를 가지고 :
----------------------------------- | Id | Name | |---------------------------------| | 1 | aaa,bbb,ccc,ddd,eee | -----------------------------------
도움이 되었기를 바랍니다!
-
==============================
2.이 문서에서는 코드하지 않은 XML 인코딩 연결 한 문자열 값의 개선 된 버전을 포함하여 SQL에서 문자열을 연결하는 다양한 방법을 다룹니다.
이 문서에서는 코드하지 않은 XML 인코딩 연결 한 문자열 값의 개선 된 버전을 포함하여 SQL에서 문자열을 연결하는 다양한 방법을 다룹니다.
SELECT ID, abc = STUFF ( ( SELECT ',' + name FROM temp1 As T2 -- You only want to combine rows for a single ID here: WHERE T2.ID = T1.ID ORDER BY name FOR XML PATH (''), TYPE ).value('.', 'varchar(max)') , 1, 1, '') FROM temp1 As T1 GROUP BY id
무슨 일이 일어나고 있는지 이해하기 위해, 내부 쿼리를 시작합니다
SELECT ',' + name FROM temp1 As T2 WHERE T2.ID = 42 -- Pick a random ID from the table ORDER BY name FOR XML PATH (''), TYPE
당신이 FOR XML을 지정하고 있기 때문에, 당신은 모든 행을 나타내는 XML 조각을 포함하는 단일 행을 얻을 것이다.
첫 번째 열에 대한 열 별칭을 지정하지 않았기 때문에, 각 행은 대한의 XML의 PATH 후 괄호에 지정된 이름을 가진 XML 요소에 싸여 될 것이다. 당신이 XML의 PATH ( 'X')에 대해서 가지고 있던 예를 들어, 당신처럼 보인다고 XML 문서를 얻을 것입니다 :
<X>,aaa</X> <X>,bbb</X> ...
당신이 요소 이름을 지정하지 않았기 때문에 그러나, 당신은 단지 값의 목록을 얻을 :
,aaa,bbb,...
.value는 ( '.', 'VARCHAR (최대)은') 간단히 "특별한"문자를 XML은 인코딩없이, 결과 XML 조각에서 값을 검색합니다. 이제 문자열 그 모습 등이 있습니다 :
',aaa,bbb,...'
물건의 기능은 당신에게 최종 결과를 제공, 최고의 쉼표를 제거하는 외모와 같은 :
'aaa,bbb,...'
그것은 아주 첫눈에 혼란 보이지만, 몇 가지 다른 옵션에 비해 매우 잘 수행하는 경향 않습니다.
-
==============================
3.PATH 모드는 SELECT 쿼리에서 생성 XML에 사용되는
PATH 모드는 SELECT 쿼리에서 생성 XML에 사용되는
1. SELECT ID, Name FROM temp1 FOR XML PATH; Ouput: <row> <ID>1</ID> <Name>aaa</Name> </row> <row> <ID>1</ID> <Name>bbb</Name> </row> <row> <ID>1</ID> <Name>ccc</Name> </row> <row> <ID>1</ID> <Name>ddd</Name> </row> <row> <ID>1</ID> <Name>eee</Name> </row>
출력은 결과 집합 내의 각 열 값가 행 요소에 싸여 요소 중심 XML이다. SELECT 절 열 이름에 대한 별칭을 지정하지 않기 때문에, 생성 된 자식 요소 이름은 SELECT 절에서 해당 열 이름과 동일하다.
행 세트의 각 행에 대한 태그가 부가된다.
2. SELECT ID, Name FROM temp1 FOR XML PATH(''); Ouput: <ID>1</ID> <Name>aaa</Name> <ID>1</ID> <Name>bbb</Name> <ID>1</ID> <Name>ccc</Name> <ID>1</ID> <Name>ddd</Name> <ID>1</ID> <Name>eee</Name>
2 단계의 경우 : 길이가 0 인 문자열을 지정하는 경우, 포장 요소가 생성되지 않습니다.
3. SELECT Name FROM temp1 FOR XML PATH(''); Ouput: <Name>aaa</Name> <Name>bbb</Name> <Name>ccc</Name> <Name>ddd</Name> <Name>eee</Name> 4. SELECT ',' +Name FROM temp1 FOR XML PATH('') Ouput: ,aaa,bbb,ccc,ddd,eee
4 단계에서 우리는 값을 연결합니다.
5. SELECT ID, abc = (SELECT ',' +Name FROM temp1 FOR XML PATH('') ) FROM temp1 Ouput: 1 ,aaa,bbb,ccc,ddd,eee 1 ,aaa,bbb,ccc,ddd,eee 1 ,aaa,bbb,ccc,ddd,eee 1 ,aaa,bbb,ccc,ddd,eee 1 ,aaa,bbb,ccc,ddd,eee 6. SELECT ID, abc = (SELECT ',' +Name FROM temp1 FOR XML PATH('') ) FROM temp1 GROUP by iD Ouput: ID abc 1 ,aaa,bbb,ccc,ddd,eee
6 단계에서 우리는 ID로 날짜를 그룹화하고 있습니다.
다도 (을 source_string, 시작, 길이, add_string) 매개 변수 또는 인수 을 source_string 소스 문자열을 수정할 수 있습니다. 스타트 삭제 길이 자로을 source_string에서 다음 add_string 삽입 위치입니다. 길이 문자의 수는을 source_string에서 삭제합니다. add_string 문자의 순서는 시작 위치에서을 source_string에 삽입합니다.
SELECT ID, abc = STUFF ( (SELECT ',' +Name FROM temp1 FOR XML PATH('')), 1, 1, '' ) FROM temp1 GROUP by iD Output: ----------------------------------- | Id | Name | |---------------------------------| | 1 | aaa,bbb,ccc,ddd,eee | -----------------------------------
-
==============================
4.이 정확한 시나리오를 처리 할 수있는 푸른 SQL 데이터베이스 및 (2017로 시작하는) SQL Server의 아주 새로운 기능이 있습니다. 나는 이것이 당신이 XML / 물건 방법으로 달성 하려는지에 대한 기본 공식 방법이 될 것이라고 생각합니다. 예:
이 정확한 시나리오를 처리 할 수있는 푸른 SQL 데이터베이스 및 (2017로 시작하는) SQL Server의 아주 새로운 기능이 있습니다. 나는 이것이 당신이 XML / 물건 방법으로 달성 하려는지에 대한 기본 공식 방법이 될 것이라고 생각합니다. 예:
select id, STRING_AGG(name, ',') as abc from temp1 group by id
STRING_AGG - https://msdn.microsoft.com/en-us/library/mt790580.aspx
편집 : 나는 원래 나는 잠재적 인 기능을 포함하는 것이라고 보았다 생각으로 저는 SQL 서버 2016의 언급 만든이 게시합니다. 하나의 버전을 수정 제안 편집에 대한 감사 나는 잘못이 기억 또는 무언가가 변경되었습니다. 또한, 꽤 감명을 완전히 단지 마지막 옵션에 대한 저를 뽑아 여러 단계의 검토 과정을 인식하지 않았다.
-
==============================
5.XML 경로에서는 다음 태그는 각 행에 첨가 될 것이다 XML 경로 ( 'ENVELOPE')]과 같은 임의의 값을 정의하면 :
XML 경로에서는 다음 태그는 각 행에 첨가 될 것이다 XML 경로 ( 'ENVELOPE')]과 같은 임의의 값을 정의하면 :
<ENVLOPE> </ENVLOPE>
-
==============================
6.
SELECT ID, abc = STUFF( (SELECT ',' + name FROM temp1 FOR XML PATH ('')), 1, 1, '' ) FROM temp1 GROUP BY id
여기서, 상기 질의 STUFF 함수는 다음이 될 것이다 방금 생성 된 XML 스트링 (AAA, BBB, CCC, DDD, EEE)로부터 제 콤마 (,)를 제거하는 데 사용된다 (단, BBB, CCC, DDD, EEE) .
그리고 XML의 PATH ( '')의 경우 단순히 (AAA, BBB, CCC, DDD, EEE) 문자열로 열 데이터를 변환하지만, PATH에 우리가 전달하는 '그것이 XML 태그를 생성하지 않도록'.
그리고 결국에 우리는 ID 열을 사용하여 기록을 분류했다.
-
==============================
7.
Declare @Temp As Table (Id Int,Name Varchar(100)) Insert Into @Temp values(1,'A'),(1,'B'),(1,'C'),(2,'D'),(2,'E'),(3,'F'),(3,'G'),(3,'H'),(4,'I'),(5,'J'),(5,'K') Select X.ID, stuff((Select ','+ Z.Name from @Temp Z Where X.Id =Z.Id For XML Path('')),1,1,'') from @Temp X Group by X.ID
-
==============================
8.나는 디버깅 및 마침내 정상적인 방법의 IT에 내 '박제'쿼리를 반환했다.
나는 디버깅 및 마침내 정상적인 방법의 IT에 내 '박제'쿼리를 반환했다.
간단히
select * from myTable for xml path('myTable')
트리거 I 디버그에서 나에게 로그 테이블에 쓰기에 테이블의 내용을 제공합니다.
-
==============================
9.임 자주 where 절에 사용
임 자주 where 절에 사용
SELECT TapuAda=STUFF(( SELECT ','+TBL.TapuAda FROM ( SELECT TapuAda FROM T_GayrimenkulDetay AS GD INNER JOIN dbo.T_AktiviteGayrimenkul AS AG ON D.GayrimenkulID=AG.GayrimenkulID WHERE AG.AktiviteID=262 ) AS TBL FOR XML PATH ('') ),1,1,'')
from https://stackoverflow.com/questions/31211506/how-stuff-and-for-xml-path-work-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL SELECT에서 THEN ...는 IF를 수행합니까? (0) | 2020.03.07 |
---|---|
[SQL] SQL, 숫자의 보조 테이블 (0) | 2020.03.07 |
[SQL] 요소 번호의 PostgreSQL unnest () (0) | 2020.03.07 |
[SQL] MySQL의에서 동일한 열 값이 행을 반환하는 방법 (0) | 2020.03.07 |
[SQL] 최대 절전 모드를 사용하는 경우 어떻게 매개 변수 값을 쿼리 문자열을 인쇄 (0) | 2020.03.07 |