Eu percebo que isso tem dois anos, mas me incomoda que a resposta aceita chame o uso de SQL dinâmico e a resposta mais votada não funcionará:
Select P.ProductId, P.Name
, Min( Case When PM.MetaKey = 'A' Then PM.MetaValue End ) As A
, Min( Case When PM.MetaKey = 'B' Then PM.MetaValue End ) As B
, Min( Case When PM.MetaKey = 'C' Then PM.MetaValue End ) As C
From Products As P
Join ProductMeta As PM
On PM.ProductId = P.ProductId
Group By P.ProductId, P.Name
Você deve use um Group By ou você obterá um resultado escalonado. Se estiver usando um Group By, você deve agrupar cada coluna que não está na cláusula Group By em uma função agregada (ou uma subconsulta).