SQL存储动态数据
我有一个表,它链接到另一个表,指定键值对的值。然后,值表链接到包含名称(键)的表。表的定义(足够接近)如下所示:SQL存储动态数据,sql,sql-server,sql-server-2008,stored-procedures,pivot,Sql,Sql Server,Sql Server 2008,Stored Procedures,Pivot,我有一个表,它链接到另一个表,指定键值对的值。然后,值表链接到包含名称(键)的表。表的定义(足够接近)如下所示: --------------- Entity --------------- EntityID Name Some other data --------------- Value ---------------- ValueID EntityID Value --------------- Key --------------- KeyID ValueID Name 每个实体
---------------
Entity
---------------
EntityID
Name
Some other data
---------------
Value
----------------
ValueID
EntityID
Value
---------------
Key
---------------
KeyID
ValueID
Name
每个实体可以有多个值,每个值有一个键。每个实体可能没有相同数量的值。基本上,这种结构允许我动态添加表行,而无需修改实体表
我想在Entity表上执行select*,使用Key.Name字段作为列标题,并显示适当的Value.Values
SQL中是否有一个动态结构,我可以为实体中的每一行插入,然后返回select on
我希望这是有意义的 根据您的描述,听起来您想查看数据。有两种方法可以使用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;
看
动态轴在运行时确定列:
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中执行此操作,或者是否可以使用调用SQL的外部语言?后者会使这更容易。理论上看起来不错,但实际上一点也不好。为什么要将键和值放在不同的表中?这毫无意义,而且肯定会表现不佳。此外,您似乎正在反转键和值的角色,因为它们传统上是在EAV设计中定义的。@RBarryYoung这与表和应用程序代码中的其他内容有关。性能不会是一个问题,因为每个实体类型(此模型针对不同类型的实体重复)都只有少数几个与之相关联的动态列。我设法修改了您的示例,并使其与我的DB一起工作。非常感谢你的帮助!