Как выбрать записи таблицы сведений в качестве столбцов в основной таблице?

Мне нужно получить одну таблицу с (возможно, несколькими) столбцами, получающими свои значения из таблицы сведений. Таблица сведений в основном имеет следующие столбцы:

DetailID,
MasterID (foreign key to master ID),
DetailName (nvarchar()),
DetailValue (nvarchar())

До сих пор мне удалось использовать:

SELECT Master.ID,
  (SELECT DetailValue FROM Detail WHERE Master.ID=Detail.MasterID AND DetailName='Name1') as Detail1,
  (SELECT DetailValue FROM Detail WHERE Master.ID=Detail.MasterID AND DetailName='Name2') as Detail2
FROM Master

но это очень плохо масштабируется, когда я добавляю больше деталей.

Что было бы эффективным способом сделать это?


person mav    schedule 28.11.2016    source источник
comment
Я думаю, вы можете найти здесь помощь в решении вашей проблемы с помощью Dynamic Pivot   -  person Radu Gheorghiu    schedule 28.11.2016
comment
eav — это анти-шаблон, в конце концов :-)   -  person Zohar Peled    schedule 28.11.2016
comment
Спасибо за ссылку; Я не знал этого шаблона под таким названием до сих пор. Эта часть не является всей моделью данных, а только той частью, где к бизнес-объектам может быть добавлена ​​произвольная дополнительная информация, поэтому я думаю, что возможные негативные последствия не будут иметь места.   -  person mav    schedule 29.11.2016


Ответы (1)


Если DetailNames известны, вы можете использовать условную агрегацию:

SELECT m.ID,
       MAX(CASE WHEN d.DetailName='Name1' THEN d.DetailValue END) as detail1,
       MAX(CASE WHEN d.DetailName='Name2' THEN d.DetailValue END) as detail2,
       ...
FROM Master m
JOIN Detail d
 ON m.ID=d.MasterID  
GROUP BY m.ID
person sagi    schedule 28.11.2016
comment
Большое спасибо - я не принял во внимание MAX(), потому что значения деталей не являются числовыми, но это работает просто отлично! - person mav; 29.11.2016