SQL объединяет две таблицы с таблицей ссылок между - GORM / Grails - PullRequest
1 голос
/ 09 марта 2012

Я пытаюсь построить вывод следующим образом:

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

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Вы можете добавить DISTINCT к вашему запросу:

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
2 голосов
/ 09 марта 2012

Не уверен, каким должен быть 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 всегда возвращает фиксированное количество столбцов. Вам нужно будет заранее решить, сколько источников должно быть возвращено запросом, и если число должно зависеть от фактического количества возможных источников в таблице Source, вам придется динамически строить запрос, чтобы включить все необходимые источники, но не более чем необходимые.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...