2013-06-08 14 views
5

Bir sql sorgusu tamamlamaya çalışıyorum ama şu anda bana sorun veriyor, belki birileri bana yardımcı olabilir.SQL tek bir sütun için sorgu sonuçları gruplandırma

Burada kısa versiyonu (fransız isimler için üzgün) tabloları var:

Lexique

ID 
terme_fr 
definition_fr  

DomaineDuTerme

lexique_id 
domaine_id 

Domaine

Dolayısıyla, Lexique tablosundaki bir öğenin birçok Domaine olabilir ve birçok Lexique öğesi için bir Domaine kullanılabilir. DomaineDuTerme tablosu, birçok ilişkiyi birçok şekilde içeren bir ara ürün olarak var.

Sorgumun her bir ayrı Lexique öğesi için kayıt kümesinin tek bir satırında domaine_fr'yi yeniden gruplandırmasını istiyorum. Şu anda istek, ara tablodaki her ilişki için bana bir kayıt döndürüyor. Bir Lexique öğesinin ihtiyaç duyulduğunda filtreleri uygulamak olduğu Domaine (ler) in bilinmesi için bu ara tabloya ihtiyacım var. Bu istek ile

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

'test' eleman katları Domaines dernek varsa, ben sonuçları gibi katları kayıtları alacak:

İşte şimdiye kadar benim talebidir. Birden çok derneklerin Dom.domaine_fr alanında listeleneceği tek bir kayıt almak istiyorum.

Bu mümkün mü? DISTINCT ve ORDER BY ile birlikte denedim, JOIN'in her sürümü ile ama hala tüm dernekleri alıyorum.

Bunu, ayrı sorgularda veya kayıt kümesini aldıktan sonra kodda yapabileceğimi biliyorum, ancak eminim SQL üzerinden bir yol var. Bu yardımcı olabiliyorsa, veritabanı şemasını yeniden düzenlemek için de açıkım.

Çok teşekkürler!

+2

Örnek verileri ve istenen sonuçları kaynağı? Ayrıca hangi RDBMS kullanıyorsunuz? – sgeddes

cevap

5

Sorunuzu doğru bir şekilde anlıyorsam, tüm domaine_fr satırlarını tek bir satıra birleştirmek istersiniz, belki de virgülle ayrılmış mı? Eğer öyleyse, doğru cevap kullanmakta olduğunuz RDBMS'ye bağlıdır. MySQL için GROUP_CONCAT'u kullanabilir ve Oracle için LISTAGG'u kullanabilirsiniz. SQL Server bunu biraz daha zorlaştırır, ancak aynı sonuçları elde etmek için FOR XML'u kullanabilirsiniz.


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

Detaylı cevap için teşekkür ederim, ihtiyacım olan şey bu. –

+0

@Oli_G - np, yardımcı olabileceğime sevindim! – sgeddes

İlgili konular