2013-06-08 2 views
5

SQL 쿼리를 완료하려고하는데 문제가 생길 수 있습니다. maybee 누군가가 도와 줄 수 있습니다.단일 열에 대한 SQL 그룹화 쿼리 결과

여기에 짧은 버전 (프랑스 이름에 대한 죄송) 테이블을이다 :

Lexique

ID 
terme_fr 
definition_fr  

에게 DomaineDuTerme

lexique_id 
domaine_id 

도멘

ID 
domaine_fr 

따라서 Lexique 테이블의 한 요소는 많은 Domaine을 가질 수 있으며 하나의 Domaine은 많은 Lexique 요소에 사용될 수 있습니다. DomaineDuTerme 테이블에는 many to many 관계가 포함 된 중간체가 있습니다.

각각의 고유 한 Lexique 요소에 대한 레코드 집합의 단일 행에 domaine_fr을 재구성하는 쿼리가 필요합니다. 현재 요청은 중간 테이블에서 발견 된 모든 관계에 대한 레코드를 반환합니다. Domaine (s)에서 Lexique 요소가 필요한 경우 필터를 적용하는 것이 무엇인지 알기 위해이 중간 테이블이 필요합니다. 이 요청을

SELECT 
    Lex.terme_fr, 
    Lex.definition_fr, 
    Dom.domaine_fr 
FROM 
    ((Lexique AS Lex 
    LEFT JOIN 
    DomaineDuTerme AS Ddt ON Lex.ID = Ddt.lexique_id) 
    LEFT JOIN  
    Domaine AS Dom ON Ddt.domaine_id = Dom.ID)  
WHERE Lex.terme_fr='test' ` 

'테스트'요소가 배수 DOMAINES 연관이있는 경우, 나는 결과로 배수 기록을 얻을 것이다 :

여기에 지금까지 내 요청입니다. 다중 레코드 연관이 Dom.domaine_fr 필드에 나열되는 단일 레코드를 얻고 싶습니다.

이것이 가능합니까? 나는 DISTINCT와 ORDER BY뿐만 아니라 모든 버전의 JOIN으로 시도했지만 여전히 모든 연관을 얻는다.

나는 별도의 쿼리 또는 레코드 세트를 가져온 후 코드에서 수행 할 수 있음을 알고 있지만 SQL을 통한 방법이 있다고 확신합니다. 또한 도움이 될 수 있다면 데이터베이스 스키마를 재구성 할 수 있습니다.

많은 감사!

+2

당신은 샘플 데이터 및 원하는 결과를 제공 할 수 있습니까? 또한, 어떤 RDBMS를 사용하고 있습니까? – sgeddes

답변

5

질문을 올바르게 이해하고 있다면 모든 domaine_fr 행을 쉼표로 구분 된 단일 행으로 결합하고 싶습니까? 그렇다면 정답은 사용중인 RDBMS에 따라 다릅니다. MySQL의 경우 GROUP_CONCAT을 사용할 수 있으며 오라클의 경우 LISTAGG을 사용할 수 있습니다. SQL Server를 사용하면 약간의 어려움이 있지만 동일한 결과를 얻으려면 FOR XML을 사용할 수 있습니다.


MySQL은 :

SELECT 
    Lex.terme_fr, 
    Lex.definition_fr, 
    GROUP_CONCAT(Dom.domaine_fr SEPARATOR ', ') AS domaine_fr 
FROM 
    ((Lexique AS Lex 
    LEFT JOIN 
    DomaineDuTerme AS Ddt ON Lex.ID = Ddt.lexique_id) 
    LEFT JOIN  
    Domaine AS Dom ON Ddt.domaine_id = Dom.ID)  
WHERE Lex.terme_fr='test' ` 
GROUP BY 
    Lex.terme_fr, 
    Lex.definition_fr 

오라클 :

SELECT 
    Lex.terme_fr, 
    Lex.definition_fr, 
    LISTAGG(Dom.domaine_fr, ',') WITHIN GROUP (ORDER BY Dom.domaine_fr) AS domaine_fr 
FROM 
    ((Lexique AS Lex 
    LEFT JOIN 
    DomaineDuTerme AS Ddt ON Lex.ID = Ddt.lexique_id) 
    LEFT JOIN  
    Domaine AS Dom ON Ddt.domaine_id = Dom.ID)  
WHERE Lex.terme_fr='test' ` 
GROUP BY 
    Lex.terme_fr, 
    Lex.definition_fr 

SQL 서버 :

SELECT 
    Lex.terme_fr, 
    Lex.definition_fr, 
    STUFF((SELECT ', ' + Dom2.domaine_fr 
      FROM Domaine Dom2 
      WHERE Dom.Id = Dom2.Id 
      FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS domaine_fr 
FROM 
    ((Lexique AS Lex 
    LEFT JOIN 
    DomaineDuTerme AS Ddt ON Lex.ID = Ddt.lexique_id) 
    LEFT JOIN  
    Domaine AS Dom ON Ddt.domaine_id = Dom.ID)  
WHERE Lex.terme_fr='test' ` 
GROUP BY 
    Lex.terme_fr, 
    Lex.definition_fr 
+1

상세한 답변 해 주셔서 감사합니다. 이것이 제가 필요한 것입니다. –

+0

@Oli_G - np, 기꺼이 도와 드리겠습니다! – sgeddes