Je me rends compte que cela date de deux ans, mais cela me dérange que la réponse acceptée appelle à l'utilisation de SQL dynamique et que la réponse la plus votée ne fonctionnera pas :
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
Vous devez utilisez un groupe par ou vous obtiendrez un résultat échelonné. Si vous utilisez un Group By, vous devez encapsuler chaque colonne qui n'est pas dans la clause Group By dans une fonction d'agrégation (ou une sous-requête).