2

我有一个表,它链接到另一个表,指定键值对的值。然后 Value 表链接到一个包含名称(键)的表。这些表的定义(足够接近)如下:

---------------
Entity
---------------
EntityID
Name
Some other data

---------------
Value
----------------
ValueID
EntityID
Value

---------------
Key
---------------
KeyID
ValueID
Name

每个实体可以有多个值,每个值都有一个键。每个实体可能没有相同数量的值。基本上,这种结构允许我动态添加表行,而无需修改实体表。

我想在实体表上选择 *,使用 Key.Name 字段作为列标题,并显示适当的 Value.Values

SQL 中是否有可用的动态结构,我可以对 Entity 中的每一行进行插入,然后返回一个选择?

我希望这是有道理的!

4

1 回答 1

5

根据您的描述,听起来您想要PIVOT数据。使用 PIVOT 有两种方法可以做到这一点,一种是您对要转换的列进行编码的静态 Pivot,另一种是在执行时确定列的动态 Pivot。

静态枢轴:

select *
from
(
  select e.entityid, v.value,
    e.name EntityName, k.name KeyName
  from value v
  left join entity e
    on v.entityid = e.entityid
  left join [key] k
    on v.valueid = k.valueid
) x
pivot
(
  max(value)
  for KeyName in ([name 1], [name 2], [name 3], [name 4], [name 5])
) p;

请参阅带有演示的 SQL Fiddle

Dynamic Pivot 在运行时确定列:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
                    from [key]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT entityid, EntityName, ' + @cols + ' from 
             (
                select e.entityid, v.value,
                  e.name EntityName, k.name KeyName
                from value v
                left join entity e
                  on v.entityid = e.entityid
                left join [key] k
                  on v.valueid = k.valueid
            ) x
            pivot 
            (
                max(value)
                for KeyName in (' + @cols + ')
            ) p '

execute(@query)

请参阅带有演示的 SQL Fiddle

这两个都可以放在存储过程中。如果您为每个表发布一些示例数据,然后发布所需的结果,则更容易确定正确的查询。

于 2012-10-09T13:25:49.453 回答