Нет простого способа сделать это.
Концепция сводной таблицы (уже упоминавшейся в другом ответе) - это в основном то, что вы ищете, за исключением того, что сводные таблицы требуют, чтобы вы знали имена столбцов, которые вы хотите использовать. Очевидно, это проблема, когда вы хотите использовать всю мощь такой конструкции стола!
В моей предыдущей жизни я просто остановился на количестве столбцов X, например, 20-30, и если их не было, то в набор строк было включено несколько нулевых значений. Ничего страшного.
select piv.name,
max(case piv.a_name when 'Gender' then piv.a_value else null end) as Gender,
max(case piv.a_name when 'Age' then piv.a_value else null end) as Age,
max(case piv.a_name when 'Hobby' then piv.a_value else null end) as Hobby
from
(select p.name as name, pa.name as a_name, pa.value as a_value
from person p, personattribute pa
where p.id = pa.personid) piv
group by piv.name
Это сгенерирует вывод примерно так:
name | gender | age | hobby
-----------+--------+-----+---------
Bob Swift | Male | | Reading
John Doe | Male | 30 |
(2 rows)
Что чертовски близко к тому, что вы ищете. Я бы оставил все это на уровне приложений.
Я также настоятельно рекомендую включить атрибут NAME как часть возвращаемого значения, чтобы обеспечить контекст для VALUE.
Эти типы так называемых конструкций Entity-Attribute часто заканчиваются тем, что им приходится полагаться на комбинацию серверных функций, хранимых процедур и жестко закодированных запросов.