. 방법은 다음과 같습니다
첫째, 부모/자식 테이블 구조를 고려해야합니다 몇 가지 테스트 데이터를 추가
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
가능한 복제 http://stackoverflow.com/questions/6899/is-there-a-way-to-create-a-sql-server-function-to-join-multiple-rows-from- a-sub – Seph
네, 죄송합니다. 내 문제는 내가 단어 연결을 검색하지 못했습니다! – jamesmhaley