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