SQL使用-GORM/Grails之间的链接表连接两个表

SQL使用-GORM/Grails之间的链接表连接两个表,sql,grails,join,Sql,Grails,Join,我正在尝试建立这样的输出: Name source source source Tim Other TV Radio 其中,我要组合Person表和Source表: Person ID Name 1 Tim Source ID Name 1 Other 2 TV 3 Radio Person_Source p_id s_id 1 1 1 2 我有一个查询,它构建了时间的每个来源,并以多行输出。我在结果集中寻找一个结果 select source

我正在尝试建立这样的输出:

Name source source source
Tim  Other  TV      Radio
其中,我要组合Person表和Source表:

Person
ID Name
1  Tim

Source
ID Name
1  Other
2  TV
3  Radio

Person_Source
p_id  s_id
 1     1
 1     2
我有一个查询,它构建了时间的每个来源,并以多行输出。我在结果集中寻找一个结果

select source.name
from person left join person_source
on person_source.person_source_id = person.id join source
on source.id = person_source.source_id

您可以向查询中添加一个独特的:

select DISTINCT source.name
from person left join person_source
on person_source.person_source_id = person.id join source
on source.id = person_source.source_id

您可以向查询中添加一个独特的:

select DISTINCT source.name
from person left join person_source
on person_source.person_source_id = person.id join source
on source.id = person_source.source_id

不确定这应该是什么味道的SQL,但您可以尝试以下方法:

SELECT
  p.Name,
  MAX(CASE s.ID WHEN 1 THEN s.Name END) AS source1,
  MAX(CASE s.ID WHEN 2 THEN s.Name END) AS source2,
  MAX(CASE s.ID WHEN 3 THEN s.Name END) AS source3
FROM Person p
  INNER JOIN Person_Source ps ON p.ID = ps.p_id
  INNER JOIN Source s ON ps.s_id = s.ID
GROUP BY
  p.ID,
  p.Name
您也可以使用不同的源名称检查源,如下所示:

…
  MAX(CASE s.Name WHEN 'TV'    THEN s.Name END) AS source1,
  MAX(CASE s.Name WHEN 'Radio' THEN s.Name END) AS source2,
  MAX(CASE s.Name WHEN 'Other' THEN s.Name END) AS source3
…

请注意,SQL查询始终返回固定数量的列。您需要事先决定查询应返回多少个源,如果数量取决于源表中可能的源的实际数量,则必须动态构建查询,包括所有必需的源,但不超过必需的源。

不确定这应该是什么味道的SQL,但您可以尝试以下方法:

SELECT
  p.Name,
  MAX(CASE s.ID WHEN 1 THEN s.Name END) AS source1,
  MAX(CASE s.ID WHEN 2 THEN s.Name END) AS source2,
  MAX(CASE s.ID WHEN 3 THEN s.Name END) AS source3
FROM Person p
  INNER JOIN Person_Source ps ON p.ID = ps.p_id
  INNER JOIN Source s ON ps.s_id = s.ID
GROUP BY
  p.ID,
  p.Name
您也可以使用不同的源名称检查源,如下所示:

…
  MAX(CASE s.Name WHEN 'TV'    THEN s.Name END) AS source1,
  MAX(CASE s.Name WHEN 'Radio' THEN s.Name END) AS source2,
  MAX(CASE s.Name WHEN 'Other' THEN s.Name END) AS source3
…

请注意,SQL查询始终返回固定数量的列。您需要事先决定查询应返回多少个源,如果数量取决于源表中可能的源的实际数量,则必须动态构建查询,以包括所有必需的源,但不超过必需的源。

为什么您所需的输出显示为Radio?在您的示例数据中,PERSON\u SOURCE似乎没有相应的记录。为什么您希望的输出显示Radio?似乎PERSON_SOURCE在您的示例数据中没有相应的记录。这使我能够使用结果集并处理数据。谢谢这使我能够使用结果集和处理数据。谢谢