2013-06-08 68 views
5

Tôi đang cố gắng hoàn thành một truy vấn sql nhưng nó mang lại cho tôi sự cố ngay bây giờ, maybee ai đó có thể giúp tôi với nó.Kết quả truy vấn nhóm SQL cho một cột đơn

Dưới đây là các bảng trong phiên bản ngắn hơn (xin lỗi vì những cái tên tiếng Pháp):

Lexique

ID 
terme_fr 
definition_fr  

DomaineDuTerme

lexique_id 
domaine_id 

Domaine

ID 
domaine_fr 

Vì vậy, một yếu tố trong bảng Lexique có thể có nhiều Domaine, và một Domaine có thể được sử dụng cho nhiều yếu tố Lexique. Bảng DomaineDuTerme là một trung gian có chứa nhiều mối quan hệ.

Tôi muốn truy vấn của mình để nhóm lại domaine_fr trong một hàng của recordset cho từng phần tử Lexique riêng biệt. Hiện tại, yêu cầu trả lại cho tôi một bản ghi cho mọi mối quan hệ được tìm thấy trong bảng trung gian. Tôi cần bảng trung gian này để biết trong đó có một phần tử Lexique là áp dụng các bộ lọc khi cần thiết.

Đây là yêu cầu của tôi cho đến nay:

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' ` 

Với yêu cầu này, nếu các yếu tố 'test' có các hiệp hội bội Domaines, tôi sẽ nhận được bội số hồ sơ như kết quả. Tôi muốn có một bản ghi duy nhất nơi các hiệp hội nhiều người sẽ được liệt kê trong trường Dom.domaine_fr.

Điều này có khả thi không? Tôi đã thử với DISTINCT và ORDER BY, cũng như với mọi phiên bản JOIN nhưng tôi vẫn nhận được tất cả các liên kết.

Tôi biết tôi có thể làm điều đó trong các truy vấn riêng biệt, hoặc trong mã sau khi nhận được recordset, nhưng tôi chắc chắn có một cách thông qua SQL. Tôi cũng mở để tổ chức lại lược đồ cơ sở dữ liệu nếu điều này có thể hữu ích.

Rất cám ơn!

+2

Bạn có thể cung cấp dữ liệu mẫu và kết quả mong muốn? Ngoài ra, RDBMS bạn đang sử dụng? – sgeddes

Trả lời

5

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn kết hợp tất cả các hàng domaine_fr thành một hàng duy nhất, có thể được phân tách bằng dấu phẩy? Nếu vậy, câu trả lời đúng tùy thuộc vào RDBMS mà bạn đang sử dụng. Đối với MySQL, bạn có thể sử dụng GROUP_CONCAT và cho Oracle bạn có thể sử dụng LISTAGG. SQL Server làm cho nó khó hơn một chút, nhưng bạn có thể sử dụng FOR XML để đạt được kết quả tương tự.


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 

Oracle:

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 Server:

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

Cảm ơn bạn đã trả lời chi tiết, đây chính xác là những gì tôi cần. –

+0

@Oli_G - np, rất vui vì tôi có thể trợ giúp! – sgeddes

Các vấn đề liên quan