Вы хотите изменить ключевые значения. Вы можете сделать это вручную следующим образом:
select a.*
, max(case b.key when 'Name' then b.value end) Name
, max(case b.key when 'DOB' then b.value end) DOB
from TableA a
left join TableB b
on a.id = b.table_a_id
group by a.id
, a.title
, a.date
, a.etc
Приведенный выше запрос будет работать, если у вас есть только один из каждого атрибута для данной записи в Таблице A, в противном случае он даст вам наибольшее значение. Если вам нужно несколько значений, вы можете сгенерировать последовательность для каждого атрибута, как показано в подпункте с именем B ниже:
select a.ID
, b.Seq
, a.Title
, a.Date
, a.Etc
, max(case b.key when 'Name' then b.value end) Name
, max(case b.key when 'DOB' then b.value end) DOB
from TableA a
left join (select @Seq:=case
when @aid=b.Table_A_ID and @key=b.key
then @Seq + 1
else 1
end Seq
, @aid:=b.Table_A_ID Table_A_ID
, @key:=b.key `Key`
, b.value
from tableB b
order by table_a_id, b.key) b
on a.id = b.table_a_id
group by a.id, a.title, a.date, a.etc, b.Seq;
Это отличается от ответа @ GMB тем, что он будет возвращать каждый атрибут только один раз с пустыми значениями в строках, где для каждого атрибута меньше значений, тогда как решение @ GMB возвращает произведение CROSS всех атрибутов для данной строки.