Мы успешно использовали следующий подход в прошлом...
SELECT [p].ProductID,
[p].Name,
MAX(CASE [m].MetaKey
WHEN 'A'
THEN [m].MetaValue
END) AS A,
MAX(CASE [m].MetaKey
WHEN 'B'
THEN [m].MetaValue
END) AS B,
MAX(CASE [m].MetaKey
WHEN 'C'
THEN [m].MetaValue
END) AS C
FROM Products [p]
INNER JOIN ProductMeta [m]
ON [p].ProductId = [m].ProductId
GROUP BY [p].ProductID,
[p].Name
Это могут также быть полезные агрегирования перемещения с использованием...
SUM(CASE x WHEN 'y' THEN yVal ELSE 0 END) AS SUMYVal
РЕДАКТИРОВАНИЕ
Также стоящий замечания это использует стандарт ANSI SQL и таким образом, это будет работать через платформы :)
Select a.ProductId
,a.Name
,(Select c.MetaValue
From [Product Meta] c
Where c.ProductId = a.ProductId
And c.MetaKey = 'A') As 'A'
,(Select d.MetaValue
From [Product Meta] d
Where d.ProductId = a.ProductId
And d.MetaKey = 'B') As 'B'
,(Select e.MetaValue
From [Product Meta] e
Where e.ProductId = a.ProductId
And e.MetaKey = 'C') As 'C'
From Products a
Order By a.ProductId Asc
используйте хранимую процедуру здесь: http://www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables
также проверяет комментарии.
Если ваша база данных - 2005, а ваша база данных находится в режиме совместимости 2000, вы можете обойти более низкий режим совместимости, запустив запрос из базы данных 2005. Нацельтесь на базу данных 2000, используя соглашение об именах трех частей для ваших таблиц в запросе, например DatabaseNameHere.dbo.TableNameHere