a. 커서를 쓰면 안되며,
b. 임시 테이블 또는 테이블 변수와 같은 것 사용 없이 쿼리 한방으로 결과 뽑기
c. 대신 SQL 2005의 CTE 등은 이용해도 되기 입니다.
1. 먼저 테이블을 만든다.
create table Name (id int, NAME varchar(50));
2. 데이터를 입력한다.
insert into dbo.Name(id, NAME) values (1, 'Jamie');
insert into dbo.Name(id, NAME) values (1, 'Joe');
insert into dbo.Name(id, NAME) values (1, 'John');
insert into dbo.Name(id, NAME) values (2, 'Sai');
insert into dbo.Name(id, NAME) values (2, 'Sam');
insert into dbo.Name(id, NAME) values (3, 'Roger');
insert into dbo.Name(id, NAME) values (4, 'Walter');
insert into dbo.Name(id, NAME) values (4, 'Teddy');
3. 열심히 구글링하면서 찾아낸 해결책 select distinct "id", stuff((SELECT ', '+RTRIM("Name") FROM dbo.Name A where A.id = B.id for XML PATH('')),1,1,'') as NAME FROM Name B;
- stuff(문자열, 시작 바이트, 길이, 대체문자열) : string의 replace() 함수랑 비슷한 역할을 한다.
- for XML Path('') : 결과를 xml 문서로 바꿔준다. 파라미터로 길이가 0인 문자열이 입력되면 row를 연결한 문자열이 된다.
4. CTE 해결법 WITH ConcatNamesCTE (id, name, rn) AS
(
SELECT id, name, rn
FROM
(
SELECT id, name, row_number() OVER(PARTITION BY id ORDER BY id) AS rn