6

我正在尝试完成一个 sql 查询,但它现在给我带来了麻烦,也许有人可以帮助我。

这是较短版本的表格(对不起法语名称):

词汇

ID  
terme_fr  
definition_fr    

DomaineDuTerme

lexique_id  
domaine_id  

域名

ID  
domaine_fr

因此,Lexique 表中的一个元素可以有多个 Domaine,一个 Domaine 可以用于多个 Lexique 元素。DomaineDuTerme 表作为包含那些多对多关系的中间体。

我希望我的查询为每个不同的 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'  `

有了这个请求,如果 'test' 元素有多个 Domaines 关联,我会得到多个记录作为结果。我想获得一条记录,其中多重关联将列在 Dom.domaine_fr 字段中。

这可能吗?我确实尝试了 DISTINCT 和 ORDER BY,以及每个版本的 JOIN,但我仍然得到所有关联。

我知道我可以在单独的查询中执行此操作,或者在获取记录集后在代码中执行此操作,但我确信有一种通过 SQL 的方法。如果有帮助,我也愿意重新组织数据库模式。

非常感谢 !

4

1 回答 1

6

如果我正确理解了您的问题,您想将所有 domaine_fr 行组合成一行,也许用逗号分隔?如果是这样,正确答案取决于您使用的 RDBMS。对于 MySQL,您可以使用GROUP_CONCAT,对于 Oracle,您可以使用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
于 2013-06-08T20:34:05.147 回答