【问题标题】:How to select details table entries as columns in master table?如何选择明细表条目作为主表中的列?
【发布时间】:2017-04-12 07:06:48
【问题描述】:

我需要一个表,其中包含(可能有几个)列从详细信息表中接收它们的值。 详细信息表基本上有这些列:

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

但是当我添加更多细节时,这会变得非常糟糕。

什么是执行此操作的有效方法?

【问题讨论】:

  • 我想你可以在这里找到解决问题的方法,Dynamic Pivot
  • eav 毕竟是反模式:-)
  • 感谢您的链接;直到现在我才知道这个名字。这部分不是整个数据模型,而只是可以向业务对象添加任意附加信息的部分,所以我认为可能的负面影响不会出现。

标签: sql-server join master-detail


【解决方案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

【讨论】:

  • 非常感谢 - 我没有考虑 MAX() 因为细节值不是数字,但它工作得很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多