2012-11-12 6 views
2

parent/child 관계에 대한 다음 예제 테이블 구조가 있습니다.여러 자식 테이블 행을 기반으로 SQL 업데이트 부모 테이블 필드

parent 테이블

id LongText 
-------------- 
10  
20  

child 테이블

id char  value 
-------------------- 
10 COLOR RED 
10 HEIGHT 1FT 
20 COLOR BLUE 
20 WIDTH 2FT 

내가 자식 테이블 행에서 특정 필드가 함께 연결된 및 부모 테이블에 배치 할 필요가 지정하는 요구 사항이있다. 가능하면 단일 SQL 쿼리에서이 작업을 완료하고 싶습니다.. 필자가 작성한 업데이트 문은 다음과 같습니다.

UPDATE 
    parent 
SET 
    LongText = COALESCE(LongText, N'') 
       + child.char + N': ' + child.val + ',' 
FROM 
    parent INNER JOIN child 
    ON 
     parent.id = child.id 

하지만 다음과 같은 결과가 있습니다.

id LongText 
------------------ 
10 COLOR: RED, 
20 COLOR: BLUE, 

내가 기대하는 (또는 내가 원하는 라고한다)이 얻을.

id LongText 
------------------ 
10 COLOR: RED,HEIGHT: 1FT 
20 COLOR: BLUE,WIDTH: 2FT 

이것은 가능합니까? 내가 어떻게이 일을 할 수 있는지에 대한 제안은? 어떤 도움을 주셔서 감사합니다!

여기에 참조 용으로 SQLfiddle이 있습니다.

답변

4
update parent 
set longtext = 
    stuff((
    select ',' + c.char + ': ' + c.val 
    from child c 
    where c.uid = parent.uid 
    for xml path(''), type).value('.','nvarchar(max)'),1,1,''); 

고객님의 SQLFiddle을 해결책으로 업데이트했습니다.

  1. STUFF() 함수는 제 1 특성으로부터 선두 ',' (쉼표)을 제거한다.

  2. FOR XML 쿼리 결과에서 XML 문서를 만들 수 있습니다. 이것은 SQL Server의 잘 알려진 트릭입니다. 열 이름이 지정되지 않았고 요소가 생성되지 않았으며 각 행의 원시 텍스트 만 출력되어 함께 단일 행에 병합되기 때문입니다.

인터넷에 관한 기사는 코드를 설명하는 데 거의 설명되지 않으므로 자세히 설명하지는 마십시오.

+0

위대한 작품! 이제는 어떻게 작동하는지 정확히 알아야만 다른 곳에서도 사용할 수 있습니다. 당신이이 성명서로 여기서 일어나는 일을 무너 뜨릴 수 있거나 나에게 읽을 링크를 제공 할 수있는 기회? – JoeFletch

+0

다시 한번 감사드립니다! 그게 도움이 됐어! – JoeFletch

관련 문제