2011-09-29 5 views
1

안녕하세요. 미리 감사드립니다.SQL Server 2005에서 SQL Server 테이블 결과 배열

우선, 배열을 테이블로 변환하고 싶지는 않습니다. 나는 그걸 할 수있어. 쉬운 :)

나는 그 반대 다.

행에 다른 테이블에있는 n 개의 행이 있습니다. 행을 출력 한 다음 해당 행의 단일 열 내에서 배열 (또는 프런트 엔드 코드가있는 배열로 해석 할 수있는 문자열)의 연결된 행을 Children라고 가정 해 봅시다. 이처럼

:

ID TITLE DESCRIPTION CHILDREN 
-------------------------------------------------------- 
36 Blah Blah Blah  ['Bob','Gary','Reginald'] 
20 Pah  Pah Pah  ['Emily','Dave'] 

당신이 볼?

나는 이것이 최선의 방법이 아님을 알고 있습니다. 그러나 여기에 설명하기에는 너무 길어서 특정한 용도로 사용됩니다.

다시 한번 감사드립니다.

+1

가능한 복제 http://stackoverflow.com/questions/6899/is-there-a-way-to-create-a-sql-server-function-to-join-multiple-rows-from- a-sub – Seph

+0

네, 죄송합니다. 내 문제는 내가 단어 연결을 검색하지 못했습니다! – jamesmhaley

답변

2

. 방법은 다음과 같습니다

첫째, 부모/자식 테이블 구조를 고려해야합니다 몇 가지 테스트 데이터를 추가

CREATE TABLE P (ID INT PRIMARY KEY, Description VARCHAR(20)); 
CREATE TABLE C (ID INT PRIMARY KEY, PID INT, 
       Description VARCHAR(20), 
       CONSTRAINT fk FOREIGN KEY (PID) REFERENCES P(ID)); 

(! 내가 타이핑을 절약하기 위해 사용 P와 C를했습니다)

을 그리고 있습니다, 일치 질문 아스 커의 : 마지막으로 다음

INSERT INTO P VALUES (36, 'Blah Blah'); 
INSERT INTO P VALUES (20, 'Pah Pah'); 

INSERT INTO C VALUES (1, 36, 'Bob'); 
INSERT INTO C VALUES (2, 36, 'Gary'); 
INSERT INTO C VALUES (3, 36, 'Reginald'); 
INSERT INTO C VALUES (4, 20, 'Emily'); 
INSERT INTO C VALUES (5, 20, 'Dave'); 

의 CTE 표현 :

,973,775 73,210

결과 :

ID Description List 
-- -------------- -------- 
20 Pah Pah  Emily,Dave 
36 Blah Blah  Bob,Gary,Reginald 

여기에 무슨 일이 일어나고 있는지 설명하기 위해, 나는 각 CTE의 일부 그것이 무엇을 설명 할 것이다.

FirstItems 모든 아이들을보고, 각 상위 그룹에서 가장 낮은 ID 다음에 선택한 재귀의 앵커로 사용할 찾습니다

FirstItems (PID, FirstCID) AS (
    SELECT C.PID, MIN(C.ID) 
     FROM C 
    GROUP BY C.PID 
) 

SubItemList 재귀 SELECT입니다 즉 집어 들고

SubItemList (PID, CID, ItemNum) AS ( 
    SELECT C.PID, C.ID, 1 
     FROM C JOIN FirstItems FI ON (C.ID = FI.FirstCID) 
    UNION ALL 
    SELECT C.PID, C.ID, IL.ItemNum + 1 
     FROM C JOIN SubItemList IL ON C.PID = IL.PID AND C.ID > CID 
) 

말썽이 최대 DUPS하고 담당자 : 이전 쿼리에서 가장 낮은 아이, 그리고 증가하는 항목 1에서 시작하여 각 자녀에 수를 할당

ItemList (PID, CID, ItemNum) AS (
SELECT PID, CID, MAX(ItemNum) 
    FROM SubItemList 
GROUP BY PID, CID 
) 

이제 우리는 X 1부터 번호가 아이들의 각 부모의 ID 목록이 : 항목을 많이 먹고, 너무 는 단지 각 그룹에서 최대를 선택하는 필터를 ITEMLIST

PID   CID   ItemNum 
----------- ----------- ----------- 
36   1   1 
36   2   2 
36   3   3 
20   4   1 
20   5   2 

SubArrayList는 번호 목록에 조인 반복적으로, 아이들의 행을 받아 하나의 설명을 시작으로, 서로 모든 설명을 추가 시작 :

결과 016,723,210은 지금 :

PID   CID   Array    ItemNum 
----------- ----------- ----------------- ----------- 
36   1   Bob    1 
20   4   Emily    1 
20   5   Emily,Dave  2 
36   2   Bob,Gary   2 
36   3   Bob,Gary,Reginald 3 

그래서 우리가해야 할 일은 모든 부분적으로 연결된 행을 제거하는 것입니다.

MaxItems (PID, MaxItem) AS ( 
    SELECT PID, MAX(ItemNum) 
     FROM SubItemList 
    GROUP BY PID   
) 

ArrayList를는 최대를 사용하여 부분적으로 연결된 행의 마지막 도태을 수행

MaxItems은 단순히 다음 쿼리 조금 더 간단하게하는 부모의 목록과 가장 높은 항목 번호를 잡고 마지막으로

ArrayList (PID, List) AS (
SELECT SAL.PID, SAL.Array 
    FROM SubArrayList SAL 
    JOIN MaxItems MI ON (SAL.PID = MI.PID AND SAL.ItemNum = MI.MaxItem)  
) 

그리고, 남아있는 모든 결과를 조회 할 수 있습니다 : :

012 항목 번호는 이전 쿼리에서 aquired
SELECT P.ID, P.Description, AL.List 
    FROM ArrayList AL JOIN P ON P.ID = AL.PID 
ORDER BY P.ID 
1

자식 테이블을 부모 테이블에 연결하는 외래 키를 전달할 때 자식 테이블을 쿼리하여 커서를 작성한 다음 필요한 값을 연결하여 반복합니다. 그런 다음 함수는 해당 문자열을 반환합니다. 그런 다음 함수를 쿼리의 네 번째 열이라고합니다. SQL 서버를 사용하지 않으므로 구문 등으로 도울 수 없습니다.

+0

정확히 내가 필요한 것! – jamesmhaley

2

여러 가지 방법이 있습니다. 기사 아래에 이러한 유형의 작업을위한 다양한 솔루션을 제공합니다 : 당신은 실제로 어떤 기능을 사용하지 않고 쿼리를 선택 한 CTE에서 모든 작업을 수행 할 수 있습니다

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

+1

+1은 가장 포괄적 인 답변이며 커서 대신 집합 기반을 사용하기도합니다. 그러나, SO의 최선의 이익에. 문서의 텍스트를 그대로 복사하고 변경하는 방법을 제안합니다. – Wayne

관련 문제