2017-05-17 1 views
2

나 테이블 구조를 보여 드리죠고유 검색 데이터 가져 오기를

예약 표

DECLARE @Book TABLE (BookID INT, BookName VARCHAR(30)) 

INSERT INTO @Book 
    (BookID, BookName) 
SELECT '1', 'Art of Programming Contest' UNION ALL 
SELECT '2', 'Programming in C' UNION ALL 
SELECT '3', 'Programming in C++' 

--SELECT * FROM @Book 

BookAuthors 표

DECLARE @BookAuthors TABLE (BookID INT, AuthorID INT) 

INSERT INTO @BookAuthors 
    (BookID, AuthorID) 
SELECT '1', '1' UNION ALL 
SELECT '1', '2' UNION ALL 
SELECT '2', '1' UNION ALL 
SELECT '2', '3' UNION ALL 
SELECT '3', '2' UNION ALL 
SELECT '3', '4' 

--SELECT * FROM @BookAuthors 

BookCategories 표

DECLARE @BookCategories TABLE (BookID INT, CategoryID INT) 

INSERT INTO @BookCategories 
    (BookID, CategoryID) 
SELECT '1', '1' UNION ALL 
SELECT '1', '2' UNION ALL 
SELECT '2', '1' UNION ALL 
SELECT '2', '3' UNION ALL 
SELECT '3', '2' UNION ALL 
SELECT '3', '4' 

--SELECT * FROM @BookCategories 

이 표를 사용하여 BookID, AuthorIDCategoryID으로 책을 검색하고 싶습니다. AuthorIDCategoryID 검색의 경우 각각 BookAuthorsBookCategories 테이블에 가입해야합니다. 그러나 AuthorId으로 검색하려고하면 결과에 여러 번 같은 BookId이 표시됩니다.

쿼리

SELECT BK.BookID, BA.AuthorID, BC.CategoryID 
FROM @Book BK 
LEFT JOIN @BookAuthors BA ON BA.BookID = BK.BookID 
LEFT JOIN @BookCategories BC ON BC.BookID = BK.BookID 
WHERE BA.AuthorID = 1 

결과

BookID ----- AuthorID ----- CategoryID 
    1    1    1 
    1    1    2 
    2    1    1 
    2    1    3 

지금이 좋은 때까지 나는 생각한다; 이제 다음과 같은 결과를 생성하고 싶습니다.

BookID ----- AuthorIDs ----- CategoryIDs 
    1    1,2    1,2 
    2    1,3    1,3 

아이디어가 있습니까?

+0

가능한 중복 (http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-microsoft-sql-server-2005) –

답변

2

결과가 왜 그렇게 출력되고 싶은지 잘 모르겠습니다. 좋은 생각이라고 생각하지 않습니다.

하지만 stuff() with select ... for xml path ('') method of string concatenation을 사용하면됩니다.

select 
    bk.BookId 
    , AuthorIds = stuff((
     select ','+convert(varchar(12),ba.AuthorId) 
     from @BookAuthors ba 
     where ba.BookId = bk.BookId 
     order by ba.AuthorId 
     for xml path (''), type).value('.','nvarchar(max)') 
     ,1,1,'') 
    , CategoryIds = stuff((
     select ','+convert(varchar(12),bc.CategoryId) 
     from @BookCategories bc 
     where bc.BookId = bk.BookId 
     order by bc.CategoryId 
     for xml path (''), type).value('.','nvarchar(max)') 
     ,1,1,'') 
from @Book bk 
where exists (
    select 1 
    from @BookAuthors ba 
    where ba.BookId = bk.BookId 
    and ba.AuthorId = 1 
) 

rextester 데모 : http://rextester.com/CVYKM71668

반환 : [? 마이크로 소프트 SQL Server 2005에서 MySQL의 기능 _concat 그룹 \ 시뮬레이션]의

+--------+-----------+-------------+ 
| BookId | AuthorIds | CategoryIds | 
+--------+-----------+-------------+ 
|  1 | 1,2  | 1,2   | 
|  2 | 1,3  | 1,3   | 
+--------+-----------+-------------+ 
+0

나와 같은, +1 :) – TriV

관련 문제