Нет простого способа сделать это.
Концепция сводной таблицы (уже упомянутая другим ответом) - это в основном то, что вы ищете, за исключением того, что сводные таблицы требуют, чтобы вы знали имена колонок, которые вы хотите использовать. Понятно, что это проблема, когда вы хотите использовать силу такого дизайна таблиц!
В моей предыдущей жизни я просто установил на 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 часто вынуждены полагаться на комбинацию специфических для сервера функций, хранимых процедур и жестко запрограммированных запросов.
Это не масштабируется, чтобы вытащить N число общих атрибутов и их значений. – Timothy