2010-03-24 4 views
0

나는이 쿼리가행 CONCAT는

EDIFICIOS_ID TITULAR 
------------ ------------------ 
1911   Ana María García 
1911   Anselmo Piedrahita 
1911   Manuel López 
2594   Carlos Pérez 
2594   Felisa García 
6865   Carlos Pérez 
6865   Felisa García 
8428   Carlos Pérez 

내가 각 EDIFICIOS_ID에 대한 직함에서 값을 연결하려는를, 그래서이 얻을 :

EDIFICIOS_ID TITULAR 
------------ ------------------ 
1911   Ana María García; Anselmo Piedrahita; Manuel López 
2594   Carlos Pérez; Felisa García 
6865   Carlos Pérez; Felisa García 
8428   Carlos Pérez 

은 내가 FOR XML PATH trick를 사용하는 것을 시도하고있다. 나는 과거에 그것을 사용해 왔지만, 그것이 어떻게 작동 하는지를 정말로 이해할 수 없기 때문에,이 특정한 경우에 그것을 적용하는 방법을 이해할 수는 없다. 나에게 몇 가지 아이디어를 제공해 줄 수 있니?

답변

3

은 다음과 같이 뭔가를 시도 :

DECLARE @TableA table (EDIFICIOS_ID int, TITULAR nvarchar(500)) 
INSERT INTO @TableA VALUES (1911 ,'Ana María García') 
INSERT INTO @TableA VALUES (1911 ,'Anselmo Piedrahita') 
INSERT INTO @TableA VALUES (1911 ,'Manuel López') 
INSERT INTO @TableA VALUES (2594 ,'Carlos Pérez') 
INSERT INTO @TableA VALUES (2594 ,'Felisa García') 
INSERT INTO @TableA VALUES (6865 ,'Carlos Pérez') 
INSERT INTO @TableA VALUES (6865 ,'Felisa García') 
INSERT INTO @TableA VALUES (8428 ,'Carlos Pérez') 

;with ResutSet AS 
(
    SELECT EDIFICIOS_ID,TITULAR FROM @TableA 
    --replace with your query here and don't use @TableA 
    -- SELECT DISTINCT IM.EDIFICIOS_ID, TI.TITULAR 
    -- FROM IMPORTACION IM 
    -- INNER JOIN I_EDIFICIO IE ON IM.IMPORTACION_ID=IE.IMPORTACION_ID 
    -- INNER JOIN I_EDIFICIO_TITULAR ET ON IM.IMPORTACION_ID=ET.IMPORTACION_ID AND IE.EDIFICIO_ID=ET.EDIFICIO_ID 
    -- INNER JOIN I_TITULAR TI ON IM.IMPORTACION_ID=TI.IMPORTACION_ID AND ET.TITULAR_ID=TI.TITULAR_ID 
    -- WHERE TI.TITULAR IS NOT NULL AND TI.TITULAR<>'' 
    -- ORDER BY IM.EDIFICIOS_ID, TI.TITULAR; 
) 
SELECT 
    c1.EDIFICIOS_ID 
     ,STUFF(
       (SELECT 
         '; ' + TITULAR 
         FROM ResutSet c2 
         WHERE c2.EDIFICIOS_ID=c1.EDIFICIOS_ID 
         ORDER BY c1.EDIFICIOS_ID, TITULAR 
         FOR XML PATH('') 
       ) 
       ,1,2, '' 
      ) AS CombinedValue 
    FROM ResutSet c1 
    GROUP BY c1.EDIFICIOS_ID 
    ORDER BY c1.EDIFICIOS_ID 

출력 :

EDIFICIOS_ID CombinedValue 
------------ --------------------------------------------------- 
1911   Ana María García; Anselmo Piedrahita; Manuel López 
2594   Carlos Pérez; Felisa García 
6865   Carlos Pérez; Felisa García 
8428   Carlos Pérez 

(4 row(s) affected) 
+0

잘 작동하는 것 같습니다. 그리고 비록 내가 전체 FOR XML PATH 메커니즘을 완전히 이해한다고 말할 수는 없지만, 제안한 쿼리 형식 (앨리어싱 된 결과 집합)을 사용하면 내가 읽은 기사의 예제가 더 깨끗해 지므로 결국에는 얻을 것이다. ;-) –

+0

@ Álvaro G. Vicario, 나는 이것이 도움이 되었기를 바란다 : 두 번 사용해야했기 때문에 귀하의 질의는 CTE 내에 "ResultSet"으로 캡슐화되어있다. "c1"쿼리는 EDIFICIOS_ID 값당 1 행을 얻습니다. 그런 다음 "c1"에서 반환 된 각 행에 대해 "STUFF"명령이 "c2"쿼리의 "magic"xml 연결에서 실행됩니다. –

+0

답변으로 수락되었습니다. 나는 여러 곳에서 사용 해왔고 다른 쿼리에 적용하기가 매우 쉽습니다. 내 북마크로 바로갑니다. –

0

이렇게하면 this question과 비슷하게 보입니다. 질문에 답해 주시면 도움이 될 것입니다. 그것은 특별히 MySQL은 SQL 서버가 아니지만 어쨌든, 그것을 확인하십시오.


편집 : 당신이 SQL Server에 대한 GROUP_CONCAT 시뮬레이션 할 수 있습니다처럼

것 같습니다 - here's a SO question that discusses that합니다.

일부 도움이 되길 바랍니다.


편집 2 :

그러나 그 날은 그냥 클라이언트 응용 프로그램에서이 작업을 수행하지하지 SQL을 통해 않는 이유를 궁금하게한다. int 값이 중복 된 검색된 테이블을 사용하여이 작업을 수행하는 것은 간단합니다. 아마 그게 접근 방법일까요?

+0

감사합니다.하지만 SQL Server에는 MySQL과 같은 기본 제공 기능이 없습니다. 나는 그것을 모방하는 XML PATH 속임수를 알고있다; 내 문제는 단지 내 쿼리가 아니라 주어진 예제에 적용하는 방법을 알고 있다는 것입니다. –

+0

클라이언트 모듈은 항목 당 행을 반환하는 큰 쿼리를 기반으로합니다. 이들 중 하나 (항목 당 하나 이상의 쿼리 또는 둘 이상의 행)를 변경하면 시장이 변경됩니다. –

0

이 정확하지 + 당신이 찾고있는 사람,하지만 값을 연결하는 MSSQL 다른 방법이 있습니다.

SELECT DISTINCT 
    1 AS TAG, 
    NULL AS PARENT, 
    EDIFICIOS_ID AS [EDIFICIOS!1!EDIFICIOS_ID], 
    NULL AS [EDIFICIOS!1!TITULAR!IDREFS] 
FROM 
    @TABLEA 
UNION ALL 
SELECT DISTINCT 
    1 AS TAG, 
    NULL AS PARENT, 
    EDIFICIOS_ID AS [EDIFICIOS!1!EDIFICIOS_ID], 
    TITULAR+';' AS [EDIFICIOS!1!TITULAR!IDREFS] 
FROM 
    @TABLEA 
ORDER BY 
    [EDIFICIOS!1!EDIFICIOS_ID] 
FOR XML EXPLICIT 
+0

Hmmm ... XML 문자열을 가진 단일 값을 얻었습니다. 신경 쓰지 마라, 나는 그것이 어떻게 작동하는지 결코 이해할 수 없을 것이다 ;-) –